Структурные операторы
if (условие) {операторы} [else {операторы}]
while (условие) {операторы}
for (выражение; условие; выражение) {операторы}
for (индекс in имя_массива) {операторы}
Структурные операторы в значительной степени аналогичны
соответствующим операторам Си. В последнем случае для каждого
индекса выполняется блок. Текстовые индексы рассматриваются в
лексикографическом порядке.
Примеры
1) awk ' $4~/40/ {if($3<=1980) {print("Фамилия: " $1 )
M["40"]++}}
$4~/50/ {M["50"]++}
END {for(i in M)
{print(" i =" i " M[" i "]=" M[i])}} ' f-awk
Результат:
Фамилия: Петров
Фамилия: Сидоров
i =40 M[40]=2
i =50 M[50]=1
2) awk ' BEGIN {ORS = " "}
{ for(k=NF; k>0; --k) {print $k}
{print RS}
} ' f-awk |
sed 's/^ //'
Результат:
50 1980 И.И. Иванов
40 1979 А.В. Петров
40 1979 С.К. Сидоров
60 1970 И.Х. Хведоров
Здесь, кроме изменения очередности полей в строке
на противоположное (что делает цикл "for"), предварительно
устанавливается выходной разделитель - пробел и весь результат
предварительно выдается в одну строку, поэтому после обработки
каждой строки выдается команда "print RS" для перевода
выходной строки. Редактор "sed" подключен через конвейер,
чтобы убрать возможные пробелы в начале строки. Существенная деталь.
Если запустить лишь базовую структуру
awk '{ for(k=NF; k>0; --k) {print $k}}' f-awk
то все поля исходной таблицы с изменениями порядка
внутри прежних строк получим вытянутыми в один столбец переводом
строки:
50
1980
И.И.
Иванов
40
1979
А.В.
Петров
40
1979
С.К.
Сидоров
60
1970
И.Х.
Хведоров
Однако, если поставим ";" сразу после условия,
т.е. сделаем пустое тело цикла, за пределы которого вынесен "print
$k"
awk '{ for(k=NF; k>0; --k); {print $k}}' f-awk
то получим исходную таблицу
Иванов И.И. 1980 50
Петров А.В. 1979 40
Сидоров С.К. 1979 40
Хведоров И.Х. 1970 60
поскольку "$k" после выхода из цикла будет
иметь значение "0", а "$0" - соответсвует
всей строке в качестве значения(!), то "print $k" будет
после каждого цикла печатать полные строки.