Выбрать главу

Поля разделяются пробелами, поэтому при вызове утилиты 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 целиком заключен в одинарные кавычки;

   • удостоверьтесь, что все кавычки внутри сценария являются парными;

   • проверьте, заключены ли процедуры в фигурные скобки, а условные конструкции - в круглые скобки.

Более понятным является сообщение об ошибке, возникающей при создании ссылки на несуществующий файл: