Руководство пользователя для GNU Awk
16. Практические awk-программы
16.2 Разные awk-программы
16.2.4 Печать почтовых ярлыков
Это программа из "реального мира". *4* Она читает списки имен и адресов и генерирует почтовые ярлыки. Каждая страница ярлыков содержит 20 ярлыков, два поперек и десять сверху вниз. Адреса гарантированно не превышают пяти строк с данными. Каждый адрес отделяется от следующего строкой пробелов.
4 "Реальный мир" определяется как " программа действительно используется для какого-то дела."
Основная идея состоит в чтении данных для 20 ярлыков. Каждая строка каждого ярлыка запоминается в массиве строк. Единственное правило предназначено для заполнения массива строк и печати страницы после того, как будут прочитаны 20 ярлыков.
Правило BEGIN просто устанавливает в RS пустую цепочку, так что awk будет разделять записи строками пробелов (см. раздел 5.1 [Как ввод разделяется на записи], стр. 37). Оно устанавливает MAXLINES на 100, поскольку MAXLINE есть количество строк на странице (20 * 5 = 100).
Большинство работы делает функция printpage. Строки ярлыка запоминаются последовательно в массиве строк. Но они должны печататься горизонтально; Строка line[1] вслед за line[6], line[2] вслед за line[7], и т.д. Два цикла используются для этих действий. Внешний цикл с параметром i имеет шаг в 10 строк данных; это дает один ряд ярлыков. Внутренний цикл с параметром j пробегает строки в пределах ряда. Так как j проходит от 0 до 4, `i+j' есть j-я строка в ряду и `i+j+5' есть вход в следующий ряд. Вывод заканчивается подобно следующему:
line 1 line 6 line 2 line 7 line 3 line 8 line 4 line 9 line 5 line 10
В заключение, на строках 21 и 61, печатается дополнительная пустая строка, чтобы вывод выравнивался по ярлыкам. Это зависит от особенностей используемых ярлыков в то время, когда писалась программа. Вы также увидите, что имеются две пустые строки наверху и внизу.
Правило END устроено так, что подавляет последнюю страницу с ярлыками; количество данных может быть не кратно 20 ярлыкам.
# labels.awk
# Arnold Robbins, arnold@gnu.org, Public Domain # June 1992
# Программа печати ярлыков по 5 строк каждый,
# возможны пустые строки . Страницы ярлыков имеют по 2
# пустые строки вверху и внизу.
BEGIN - RS = "" ; MAXLINES = 100 "" function printpage( i, j) -
if (Nlines != 0)
return
printf ""n"n" # header
for (i = 1; i != Nlines; i += 10) -
if (i == 21 ---- i == 61)
print "" for (j = 0; j ! 5; j++) -
if (i + j ? MAXLINES)
break printf " %-41s %s"n", line[i+j], line[i+j+5] "" print "" ""
printf ""n"n" # footer for (i in line)
line[i] = "" ""
# главное правило -
if (Count ?= 20) -
printpage() Count = 0 Nlines = 0 "" n = split($0, a, ""n")
for (i = 1; i != n; i++)
line[++Nlines] = a[i] for (; i != 5; i++)
line[++Nlines] = "" Count++ ""
END " -
printpage() ""
Назад | Вперед
Содержание (общее) | Содержание раздела | Содержание подраздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|