UNIX — универсальная среда программирования - Керниган Брайан Уилсон
В качестве другого примера выполнения арифметических операций рассмотрим программу, подсчитывающую число страниц по 66 строк в каждой. Страницы получаются при прогоне несколько файлов через команду
prprpages$ cat prpages# prpages: подсчет числа страниц, выдаваемых prwc $* |awk '!/total$/ { n += int(($1+55)/56) } END { print n }'$Команда
prwctotalint$ 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.92854 11172 62847 total$ prpages ch4.*53$Для проверки этого результата запустим команды
prawk$ pr ch4.* | awk 'END {print NR/66}'53$Переменные программы
awks+=$1x=="abc"x>yawkВ программе
awkNRFSFILENAME | Имя текущего входного файла |
FS | Символ разделения полей (по умолчанию приняты пробел и символ табуляции) |
NF | Число полей входной строки |
NR | Число входных строк |
OFMT | Формат вывода чисел (по умолчанию принят %gprintf(3y) |
OFS | Строка разделитель полей в выходном потоке (пробел по умолчанию) |
ORS | Строка-разделитель строк в выходном потоке (символ перевода строки по умолчанию) |
RS | Символ разделения входных строк (символ перевода строки по умолчанию) |
Таблица 4.3: Встроенные переменные awk
= += -= /= %= | Присваивание; v ор=exprv=v op (expr) |
|| | ИЛИ: expr1 || expr2expr2expr1 |
&& | И: expr1 && expr2expr2 |
! | Отрицание значения выражения |
>>= <<= == != ~ !~ | Операция отношения; !!~ |
пусто | Конкатенация строк |
+ - | Сложение, вычитание |
* / % | Умножение, деление, вычисление остатка |
++ -- | Увеличение, уменьшение (префиксное или постпрефиксное) |
Таблица 4.4: Операции, выполняемые awk
Наша проверка программы
prpagesПри редактировании большого файла очень легко (судя по опыту) случайно создать копию соседнего слова, что практически никогда не происходит преднамеренно. Для устранения таких ошибок в семействе программ Writers Workbench (рабочий набор редактора) существует программа
doubleawk