В табл. 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 выводит на экран все содержимое записи, соответствующей шаблону.
9.2.2. Работа с полями и записями
На поля текущей записи можно ссылаться следующим образом: $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 — максимальное количество рейтинговых очков, которое можно было получить за участие в прошедшем соревновании.