В качестве другого примера выполнения арифметических операций рассмотрим программу, подсчитывающую число страниц по 66 строк в каждой. Страницы получаются при прогоне несколько файлов через команду pr
prpages:$ cat prpages
# prpages: подсчет числа страниц, выдаваемых pr
wc $* |
awk '!/total$/ { n += int(($1+55)/56) }
END { print n }'
$
Команда pr
wc, которая не содержит слово total в конце строки, число страниц округляется, а затем выделяется целая часть с помощью встроенной функции int.$ wc ch4.*
753 3090 18129 ch4.1
612 2421 13242 ch4.2
637 2462 13455 ch4.3
802 2986 16904 ch4.4
50 213 1117 ch4.9
2854 11172 62847 total
$ prpages ch4.*
53
$
Для проверки этого результата запустим команды pr
awk одновременно:$ pr ch4.* | awk 'END {print NR/66}'
53
$
Переменные программы awk
s+=$1 используется числовое значение в контексте операций со строками типа x=="abc" — строковое значение в неясных случаях, например x>y, — строковое значение, если только операнды не являются явно числовыми. (Правила четко сформулированы в справочном руководстве по применению команды awk.) Строковые переменные инициируются пустой строкой. В последующих разделах строки будут активно использоваться.В программе awk
NR и FS. Их полный список приведен в табл. 4.3, а в табл. 4.4 перечислены операции, выполняемые командой.FILENAME | Имя текущего входного файла |
FS | Символ разделения полей (по умолчанию приняты пробел и символ табуляции) |
NF | Число полей входной строки |
NR | Число входных строк |
OFMT | Формат вывода чисел (по умолчанию принят %g; обратитесь к руководству по printf(3y)) |
OFS | Строка разделитель полей в выходном потоке (пробел по умолчанию) |
ORS | Строка-разделитель строк в выходном потоке (символ перевода строки по умолчанию) |
RS | Символ разделения входных строк (символ перевода строки по умолчанию) |
Таблица 4.3: Встроенные переменные awk
= += -= /= %= | Присваивание; v ор=expr есть v=v op (expr) |
|| | ИЛИ: expr1 || expr2 истина, если одно или оба истинны; expr2 не вычисляется, если expr1 истинна |
&& | И: expr1 && expr2 истина, если оба истинны; expr2 не вычисляется, если expr1 ложь |
! | Отрицание значения выражения |
>>= <<= == != ~ !~ | Операция отношения; ! и !~ это соответствие и несоответствие |
пусто | Конкатенация строк |
+ - | Сложение, вычитание |
* / % | Умножение, деление, вычисление остатка |
++ -- | Увеличение, уменьшение (префиксное или постпрефиксное) |
Таблица 4.4: Операции, выполняемые awk
Наша проверка программы prpages
При редактировании большого файла очень легко (судя по опыту) случайно создать копию соседнего слова, что практически никогда не происходит преднамеренно. Для устранения таких ошибок в семействе программ Writers Workbench (рабочий набор редактора) существует программа double
awk:$ cat double
awk '
FILENAME != prevfile { # new file
NR = 1 # reset line number