Операционная система UNIX. Руководство программиста

       

Вывод на печать


Действию может не соответствовать шаблон; в таком случае действие выполняется для всех строк, как следующая простая программа распечатки:

{ print }

Это одно из простейших действий, выполняемых awk'ом. Оно выдает каждую строку на печать. Полезнее бывает печатать не всю строку, а одно или несколько полей. Например, при использовании файла countries, описанного ранее, командная строка

awk '{ print $1, $3 }' countries

распечатывает название и население стран:

Russia 262 Canada 24 China 866 USA 219 Brazil 116 Australia 14 India 637 Argentina 26 Sudan 19 Algeria 18

Точка с запятой в конце списка операторов необязательна. awk

допускает как действие

{ print $1 }

так и

{ print $1; }

Эти два действия эквивалентны. Однако, если требуется поместить два awk-оператора в одну строку awk-текста, точка с запятой необходима. Например, число 5 можно напечатать так:

{ x=5; print x }



Скобки для оператора print также необязательны. Действие

{ print $3, $2 }

эквивалентно

{ print ($3, $2) }

Аргументы оператора print, разделенные запятыми, при печати разделяются текущим выходным разделителем полей (обычно пробелом, даже если входные поля разделяются табуляциями). OFS - это еще одна специальная переменная, которую может переустановить программист. (Полностью все такие переменные перечисляются ниже.) print может также выводить на печать цепочки, определенные непосредственно в awk-программах, например

{ print "hello, world " }

Как уже было сказано, awk предоставляет несколько специальных переменных, значениями которых бывает удобно управлять, например, FS и RS. В следующем примере вводятся еще две специальные переменные. NR и NF имеют целочисленные значения, равные соответственно номеру текущей прочитанной записи и числу полей в ней. Так, действие

{ print NR, NF, $0 }

для каждой записи выводит на печать ее номер, число полей в ней, а затем саму запись. Применение этой программы к файлу countries дает следующий результат:

1 4 Russia 8650 262 Asia 2 5 Canada 3852 24 North America 3 4 China 3692 866 Asia 4 5 USA 3615 219 North America 5 5 Brazil 3286 116 South America 6 4 Australia 2968 14 Australia 7 4 India 1269 637 Asia 8 5 Argentina 1072 26 South America 9 4 Sudan 968 19 Africa 10 4 Algeria 920 18 Africa


Программа
{ print NR, $1 }
выводит на печать
1 Russia 2 Canada 3 China 4 USA 5 Brazil 6 Australia 7 India 8 Argentina 9 Sudan 10 Algeria
Этот пример демонстрирует полезный прием: как приписать к элементам списка их последовательные номера. Оператор print без аргументов печатает текущую входную запись. Чтобы напечатать пустую строку, надо использовать
{ print "" }
awk предоставляет также оператор printf, позволяющий программисту самостоятельно задавать требуемый формат вывода. Для распечатываемых числовых значений print использует по умолчанию формат %.6g. Оператор
printf "формат", выражение, выражение, ...
преобразует указанные в списке аргументов выражения в соответствии со спецификацией, задаваемой цепочкой формат, и распечатывает их. Оператор printf практически идентичен функции printf(3S) из C-библиотеки. Например, действие
{ printf "%10s %6d %6d\n", $1, $2, $3 }
распечатывает $1 как цепочку из 10 символов (выравненную по правому краю). Второе и третье поля (6-значные числа) образуют аккуратную таблицу, состоящую из двух колонок:
Russia 8650 262 Canada 3852 24 China 3692 866 USA 3615 219 Brazil 3286 116 Australia 2968 14 India 1269 637 Argentina 1072 26 Sudan 968 19 Algeria 920 18
Оператор printf не порождает автоматически никаких выходных разделителей полей или переводов строк. Программист должен добавить их самостоятельно, как это сделано в данном примере. Можно указывать управляющие символы \n, \t, \b (забой), \r
(возврат каретки).
Есть еще одна, третья ситуация, в которой может иметь место выдача на стандартный вывод. Это происходит, когда в awk-операторе не специфицировано действие, а только шаблон. В таком случае распечатывается запись $0 целиком. Например, программа
/x/
распечатывает все записи, содержащие символ x.
Вывод на печать сопровождается использованием двух специальных переменных, OFS и ORS. По умолчанию они устанавливаются равными, соответственно, пробелу и символу перевода строки. Переменная OFS выдается на стандартный вывод, когда в списке аргумен- тов оператора print встречается запятая. Например, оператор:
{ x="hello"; y="world" print x, y }
выводит
hello world
Однако, если запятой нет:
{ x="hello"; y="world" print x y }
результат будет таким:
helloworld
Чтобы вывести запятую, можно либо явно указать ее в операторе print:
{ x="hello"; y="world" print x"," y }
либо в секции BEGIN переопределить OFS:
BEGIN { OFS=", " } { x="hello"; y="world" print x, y }
В обоих случаях результатом будет:
hello, world
Отметим, что при печати $0 выходной разделитель полей не используется.


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