В программах, которые используют массивы, часто нужны циклы, которые обращаются один раз к каждому элементу массива. В других языках, где массивы непрерывны а индексы --- положительные целые числа, это просто: можно найти все индексы счетом от наименьшего до наибольшего. Эта техника не работает в awk, поскольку любые номера или цепочки могут быть индексами. Поэтому awk имеет специальный оператор for для просмотра массива:
for (var in array)
body
Этот цикл выполняет body один раз для каждого индекса в массиве, который ваша программа ранее использовала, с переменной var в качестве очередного индекса. Приведем программу, пользующуюся этой формой оператора for. Первое правило перебирает входные записи и отмечает, какие слова появились во вводе (по крайней мере один раз), помещая их в массив со словами в качестве индексов. Второе правило просматривает все найденные элементы массива used, использованные для нахождения всех отдельных слов во вводе. Оно печатает каждое слово длиннее 10 символов и количество таких слов. См. раздел 12.3 [Встроенные функции для действий с цепочками], стр. 137, для сведений о встроенной функции length.
# Записываем 1 для каждого слова, встретившегося хотя бы один раз -
for (i = 1; i != NF; i++)
used[$i] = 1 ""
# Находим количество отдельных слов длиннее 10 символов.
END -
for (x in used)
if (length(x) ? 10) -
++num.long.words print x "" print num.long.words, "слов длиннее чем&
10 символов" ""
См. раздел 16.2.5 [Генерирование счетчиков, использующих слова], page 235, содержащий более подробный пример такого вида.
Порядок, в котором перебираются элементы массива в таких циклах, определяется внутренней организацией массивов и не может управляться или изменяться. Если новые элементы добавлять в массив операторами в теле такого цикла, это может привести к ошибкам; нельзя быть уверенным в том, что оператор цикла найдет их. Точно так же, изменение var внутри цикла может дать непредвиденные результаты. Необходимо избегать таких действий.