Согласно третьему способу все инструкции awk помещаются в отдельный файл, после чего осуществляется вызов этого файла:
awk -f файл_сценария входной_файл…
Опция -f свидетельствует о том, что инструкции awk содержатся в файле сценария.
Утилита awk анализирует информацию, содержащуюся в одном или нескольких входных файлах.
9.2. Сценарии
Сценарий awk — это набор инструкций, состоящих из шаблонов и связанных с ними процедур. Когда утилита просматривает записи входного файла, она проверяет, установлена ли опция -F или переменная FS (о ней мы поговорим ниже), задающие разделители полей записи. По умолчанию в качестве разделителя принят пробел. При обнаружении символа новой строки прочитанная строка классифицируется как запись, и к ней применяются инструкции сценария. Процесс чтения записей продолжается до тех пор, пока не будет обнаружен признак конца файла.
В табл. 9.1 приведен образец входного файла и продемонстрировано, как утилита awk его анализирует. Утилита последовательно просматривает строки файла. Отыскав первый символ–разделитель, она помечает все предыдущие символы как поле номер L Символы между первым и вторым разделителями обозначаются как поле номер 2 и т. д. Процесс анализа завершается при обнаружении символа новой строки, который по умолчанию считается признаком конца записи. После этого содержимое полей сбрасывается и утилита переходит к следующей строке файла.
Таблица 9.1. Образец анализа входного файла
Поле 1 | Разделитель | Поле 2 | Разделитель | Поле 3 | Разделитель | Поле 4 и символ новой строки. |
P. Bunny (запись 1) | # | 02/99 | # | 48 | # | Yellow\n |
J. Troll (запись 2) | # | 07/99 | # | 4842 | # | Brovm-3\n |
Инструкция awk состоит из шаблона и связанной с ним процедуры, причем количество инструкций в сценарии awk может быть очень велико. Шаблонная часть уточняет, когда следует выполнять инструкцию либо к каким входным данным она должна применяться. Процедура определяет порядок обработки данных.
Шаблоном может служить любая условная или составная конструкция либо регулярное выражение. Существует также два специальных шаблона: begin и end; Шаблон begin применяется для инициализации переменных и создания заголовков отчета. Связанная с ним процедура выполняется перед началом обработки входного файла. Шаблон end употребляется для вывода итоговых данных и выполнения инструкций по завершении обработки файла. Если никакой шаблон не указан, процедура выполняется для каждой записи из входного файла.
Тело процедуры заключается в фигурные скобки. Чаще всего процедура осуществляет вывод информации на экран, но она может также содержать операторы присваивания, управляющие конструкции и встроенные функции. Если процедура не задана, утилита awk выводит на экран все содержимое записи, соответствующей шаблону.
На поля текущей записи можно ссылаться следующим образом: $1, $2… $п. Этот метод называется идентификацией полей. Подобная схема обозначений значительно облегчает работу с полями. Например, в качестве ссылки на первое и третье поля достаточно указать:
$1, $3
Обратите внимание на то, что идентификаторы полей разделяются запятой. Чтобы сослаться на все поля записи, содержащей пять полей, можно указать:
$1, $2, $3, $4, $5
Однако проще воспользоваться идентификатором $0, который служит для обозначения всех полей текущей записи.
Когда в процессе просмотра утилита awk встречает символ новой строки, считается, что найден конец записи, после чего выполняется переход к новой строке, анализ новой записи и инициализация полей.
Чтобы вывести на экран содержимое записи, задайте в теле процедуры команду print со списком нужных полей.
Тестовый файл
Прежде чем мы перейдем к практической части, создайте файл grade.txt, на котором основано большинство примеров настоящей главы. Файл этот должен содержать несколько записей из локальной базы данных секции каратистов.
$ cat grade.txt
M. Tansley | 05/99 | 48311 | Green | 8 | 40 | 44 |
J. Lulu | 06/99 | 48317 | green | 9 | 24 | 26 |
P. Bunny | 02/99 | 48 | Yellow | 12 | 35 | 28 |
J. Troll | 07/99 | 4842 | Brown-3 | 12 | 26 | 26 |
L. Tansley | 05/99 | 4712 | Brown-2 | 12 | 30 | 28 |
Назначение полей таково:
1 — имя;
2 — дата получения пояса;
3 — порядковый номер ученика;
4 — полученный пояс;
5 — возраст;
6 — текущий рейтинг;
7 — максимальное количество рейтинговых очков, которое можно было получить за участие в прошедшем соревновании.
Поля разделяются пробелами, поэтому при вызове утилиты awk можно не указывать опцию -F.
Сохранение выходных данных
В качестве небольшого отступления напомним, что существует два способа, позволяющих сохранить результаты работы утилиты awk. Первый, более простой, способ состоит в том, чтобы перенаправить выходной поток в требуемый файл: