Поля разделяются пробелами, поэтому при вызове утилиты 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 почти невозможно избежать синтаксических ошибок. Эта утилита выводит на экран искомую строку и указывает, в каком ее месте возникла ошибка. Но сами сообщения об ошибках не слишком информативны и не всегда могут помочь в разрешении проблем.
Давайте смоделируем ситуацию, при которой возникает синтаксическая ошибка, например, пропустим двойную кавычку в предыдущей команде:
$ awk 'BEGIN {print "Name\n "} {print $1} \
END {print "\nend‑of‑report}' grade.txt
awk: cmd. line:2: END {print "\nend‑of‑report}
awk: end. line:2: ^ unterminated string
Если вы впервые сталкиваетесь с утилитой awk, краткость подобных сообщений может вас смутить. Предлагаем вам перечень правил обнаружения ошибок:
• убедитесь, что сценарий awk целиком заключен в одинарные кавычки;
• удостоверьтесь, что все кавычки внутри сценария являются парными;
• проверьте, заключены ли процедуры в фигурные скобки, а условные конструкции - в круглые скобки.
Более понятным является сообщение об ошибке, возникающей при создании ссылки на несуществующий файл: