Шрифт:
Чтобы вывести на экран содержимое записи, задайте в теле процедуры команду 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. Первый, более простой, способ состоит в том, чтобы перенаправить выходной поток в требуемый файл:
$ awk '{print $0}' grade.txt > grade.out
При этом выходные данные не будут отображаться на экране.
Второй способ заключается в применении команды tee, о которой рассказывалось в главе 5. Выходные данные передаются в файл и одновременно отображаются на экране. Например:
$ awk '{print $0}' grade.txt | tee grade.out
Отображение всех записей
В приведенной ниже команде утилита awk просматривает файл grade.txt и, поскольку шаблон не указан, отображает содержимое всех записей:
$ awk '{print $0}' grade.txt
M. Tansley
05/99
48311
Green
8
40
44
J. Lulu
06/99
48317
green
9
24
26
S. 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 и $4, поэтому введем такую команду:
$ awk '{print $1, $4}' grade.txt
M. Tansley Green
J. Lulu green S. Bunny Yellow J. Troll Brown-3
L. Tansley Brown-2
Отображение заголовка отчета
Результат работы предыдущей команды выглядит не слишком привлекательно. Рассмотрим, какие шаги можно предпринять, чтобы улучшить его. Прежде всего выровняем границы полей посредством символов табуляции. Табуляция создается с помощью Escape–последовательности \t (об управляющих последовательностях речь пойдет ниже). Кроме того, для придания отчету солидности добавим к нему заголовок, включающий названия полей, а также разделительную линию, которая отображается
в отдельной строке благодаря Escape–последовательности \n.: Заголовок отчета формируется в процедурной части шаблона begin.
$ awk 'BEGIN {print "Name Belt\n -"} \
{print $1 " \t" $4}' grade.txt
Name
Belt
M. Tansley
Green
J. Lulu
green
P. Bunny
Yellow
J. Troll
Brown-3
L. Tansley
Brown-3
Отображение резюме отчета
Чтобы добавить в конец отчета строку "end-of-report", следует воспользоваться шаблоном end. Этот шаблон употребляется для обозначения действий, которые выполняются после обработки последней записи входного файла.
$ awk 'BEGIN {print "Name\n "} {print $1} \
END {print "\nend-of-report"}' grade.txt
Name
M. Tansley
J. Lulu
P. Bunny , .
J. Troll L. Tansley
end-of-report
Обработка сообщений об ошибках
При работе с утилитой awk почти невозможно избежать синтаксических ошибок. Эта утилита выводит на экран искомую строку и указывает, в каком ее месте возникла ошибка. Но сами сообщения об ошибках не слишком информативны и не всегда могут помочь в разрешении проблем.