Массивы
Кроме обыкновенных переменных, 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.