$ 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 целиком заключен в одинарные кавычки;
• удостоверьтесь, что все кавычки внутри сценария являются парными;
• проверьте, заключены ли процедуры в фигурные скобки, а условные конструкции - в круглые скобки.
Более понятным является сообщение об ошибке, возникающей при создании ссылки на несуществующий файл:
$ awk 'END {print "End‑of‑report"}' grades.txt
awk: cmd. line":2: fatal: cannot open file 'grades.txt' for reading (No such file or directory)
Ввод данных с клавиатуры
Давайте посмотрим, что произойдет, если не указать файл grade.txt в командной строке:
$ awk 'BEGIN {print "Name Belt\n "} \
{print $1" \t"$4}'
Name Belt
>