II. Язык обработки шаблонов awk
7. Действия
В awk возможны следующие действия:
- присваивания выражений;
- операторы управления
- операторы вывода;
- встроенные функции.
Операторы управления
Простейшие операторы
exit |
завершить выполнение программы; |
next |
перейти к следующей строке, управление на начало
awk-программы; |
break |
выход из цикла; |
continue |
переход к следующей итерации; |
Структурные операторы
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" будет после каждого цикла печатать полные строки.
Назад |
Содержание |
Вперед
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|