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

Ввод из файла


В качестве примера рассмотрим файл countries. Данный файл состоит из строк, содержащих площадь (в тысячах квадратных миль), население (в миллионах человек) и континент для десяти крупнейших по площади стран мира. (Данные взяты на 1978 год; Россия отнесена к Азии.)

Russia 8650 262 Asia Canada 3852 24 North America China 3692 866 Asia USA 3615 219 North America Brazil 3286 116 South America Australia 2968 14 Australia India 1269 637 Asia Argentina 1072 26 South America Sudan 968 19 Africa Algeria 920 18 Africa

Широкие промежутки между колонками при первоначальном вводе заданы табуляциями; слова "North" ("South") и "America" отделяется одиночным пробелом. Данный файл будет использоваться в этой главе в качестве исходного во многих awk-программах, он типичен для того рода информации, для обработки которой лучше всего приспособлен awk (смесь слов и чисел, организованных в колонки или поля, разделенные пробелами либо табуляциями).

Каждая из строк файла countries состоит из четырех или пяти слов, если считать, что поля разделяются пробелами и/или табуляциями, как и подразумевается в awk'е по умолчанию, если не задано противное. В приведенном примере первой записью является

Russia 8650 262 Asia

После того, как эта запись прочитана awk'ом, она присваивается переменной $0. Если требуется сослаться на всю запись целиком, это делается при помощи $0. Например, действие

{ print $0 }

распечатывает всю запись.

Поля, принадлежащие записи, присваиваются переменным $1, $2, $3

и т.д.; это означает, что в awk-программе для обращения к первому полю текущей записи используется переменная $1, для обращения ко второму полю - переменная $2, для обращения к i-ому полю - переменная $i. Так, в приведенном выше примере (файл countries) для первой записи:

$1 эквивалентно цепочке "Russia"

$2 эквивалентно цепочке "8650"

$3 эквивалентно цепочке "262"

$4 эквивалентно цепочке "Asia"

$5 эквивалентно пустой цепочке

. . .

Чтобы напечатать континент, затем название страны, и наконец, численность населения, можно использовать следующую команду:

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

Можно заметить, что она породит не совсем тот вывод, который требуется, поскольку по умолчанию разделителем полей считается не только табуляция, но и пробел. Неудобство состоит в том, что South America и North America содержат пробел. Поэтому правильнее будет использовать команду

awk -F\t '{ print $4, $1, $3 }' countries



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