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

     

Массивы


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

x [NR] = $0

присваивает текущую входную строку NR-му элементу массива x. В принципе, если выполнить следующую awk-программу:

{ x [NR] = $0 } END { ... программа ... }

можно в произвольном порядке обрабатывать все исходные данные целиком (хотя, быть может, и довольно медленно). Первая строка этой программы заносит входные записи в массив x.

Программа

{ x [NR] = $1 }

(в случае обработки файла countries) порождает массив со следующим содержимым:

x [1] = "Russia" x [2] = "Canada" x [3] = "China" . . .

Использование в качестве индексов в массиве нечисловых значений придает awk'у возможности, сходные с возможностями ассоциативной памяти Снобол-таблиц. Например, можно написать программу

/Asia/ { pop ["Asia"] += $3 } /Africa/ { pop ["Africa"] += $3 } END { print "Asia=" pop ["Asia"] , "Africa=" pop ["Africa"] }

которая порождает результат

Asia=1765 Africa=37

Отметим, что индексные выражения можно конкатенировать. Кроме того, в качестве индекса при обращении к массиву можно использовать произвольное выражение. Так, в конструкции

area [$1] = $2

текстовое значение первого поля строки используется как индекс в массиве area.



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