Введение в Unix

Обработка текстовых файлов командой awk


Awk - утилита, подобная grep. Однако, кроме поиска по образцу, она позволяет проверять отношения между полями строк (записей) и выполнять некоторые действия над строками (генерировать отчеты). Название не является акронимом, оно образовано первыми буквами фамилий авторов (A.V.Aho, P.Y.Weinberger, B.W.Kernighan).

Задание поиска-действия следует синтаксису:

/<образец>/{<действие>}

И образец, и действие могут отсутствовать. Найденные по образцу строки при отсутствии заданного действия выводятся в стандартный вывод (на экран).

Образец задается регулярным выражением, как и в grep. Если образец отсутствует, обрабатываются все строки.

Рассмотрим примеры действий, которые можно выполнить командой awk.

Перестановка полей строки выполняется с помощью ссылки на поле $n, где n - номер поля.

Например:

$ cat people Mary Clark 101 Henry Morgan 112 Bill Williams 100 $ awk '{print $2 "," $1 "^I" $3}' people Clark, Mary 101 Morgan, Henry 112 Williams, Bill 100

где ^ (Ctrl-I) - знак табуляции для подвода каретки к очередной позиции табуляции (для выравнивания третьего поля).

Действия для awk могут быть заданы в файле.

Например:

$ cat swap {print $2 "," $1 "^I" $3} $ awk -f swap people

Awk имеет встроенные образцы и переменные. Образцы BEGIN и END означают начало и конец файла соответственно. Переменная NR (Number of Records) означает число записей (строк) в файле, NF - число полей в записи. Можно использовать переменные, объявленные пользователем. Пример, подсчитывающий среднее значение третьего поля файла tennis (программа действий для awk - в файле average):




$ cat > average {total = total + $3} END {print "Average value is", total/NR} ^D $ awk - f average tennis Average value is 8.9 $

Образец поиска в awk может содержать условные выражения. Пример, в котором в файле tennis пишутся все записи, значение третьего поля в которых не меньше 10:

$ awk '$3 >= 10 {print $0}'tennis Steve Daniel 11 Hank Parker 18 Jack Austen 14 $

Знак $0 (доллар-ноль) есть ссылка на всю запись (строку).

В общем случае выражение для условия подчиняется синтаксису, близкому к синтаксису выражений в языке C. Кроме того, в команде awk допустимо указывать отрезок образцов. Пример выборки всех записей, сделанных с 1976 до 1978 г.:

$ sort -n -o chard.s chard $ awk '/1976/, /1978/ {if($2 < 8.00 print $0}' chard.s 1976 7.50 Chateau 1977 7.75 Chateau 1978 5.99 Charles

Как видно из примера, в программах действий для awk можно использовать управляющие структуры с синтаксисом, близким к языку C.

Пример цикла для печати полей всех записей файла в обратном порядке:

$ awk {for (i = NF; i > 0; --i) print $i} f1,

где NF - число полей в записи.

Полное описание средств awk можно найти в статье авторов [6].


Содержание раздела