1. 4. Примеры awk-программ

1) awk '{print ($2, $3)}' f-awk

Результат:

И.И. 1980

А.В. 1979

С.К. 1979

И.Х. 1970

2) awk '/е/ {print ($2, $3)}' f-awk

Результат:

А.В. 1979

И.Х. 1970

3) awk '/е/ {print ($1, 2000 - $3)}' f-awk

Результат:

Петров 21

Хведоров 30

4) awk '{ s = s + $4}

END {print ("Суммарный возраст:" s)

print ("Средний возраст:" s/NR)}' f-awk

Результат:

Суммарный возраст:190

Средний возраст:47.5

5) awk '{ s += $4 }

{print("NR="NR, "NF="NF)}

END {print ("FILENAME=" FILENAME)

print ("Значение позиционной переменной" $4 "\"пусто\" \

после окончания просмотра)")

print ("Суммарный возраст:" s)

print ("Средний возраст:" s/NR)}' f-awk

Результат:

NR=1 NF=4

NR=2 NF=4

NR=3 NF=4

NR=4 NF=4

FILENAME=f-awk

Значение позиционной переменной"пусто" (после окончания просмотра)

Суммарный возраст:190

Средний возраст:47.5

        1. 5. Селекторы

Здесь "селектор" следует понимать, как расширение понятия "шаблон", поскольку там где в структуре команды указан шаблон, в общем случае может стоять любой селектор.

Замечание. Открывающая скобка действия "{" должна быть в строке селектора.

В качестве селектора может быть:

  1. выражение;

  2. шаблон;

  3. их комбинация.

Соответствующие примеры:

1) $3 != $4 && $3 > 1970

$3 % 2 == 1

$1=="Иванов" - кавычки, чтобы воспринималось, как строка.

2) /ab/ отлично от /a b/, / ab/ и /ab /

Nполя ^шаблон - по совпадению

Nполя !^шаблон - по несовпадению

Пример:

awk '$3~0 {print} ' < f-awk

echo

awk '$3!~0 {print} ' < f-awk

Иванов И.И. 1980 50

Хведоров И.Х. 1970 60

Петров А.В. 1979 40

Сидоров С.К. 1979 40

3) Шаблон может формировать множество образцов или указывать, в каком месте поля искать:

/^a/

поле начинается с "a"

/a$/

поле кончается "a"

\+

экранирует оператор

[abc]

любой из символов "a", "b" и "c"

[a-р]

любой символ диапазона

*

0 или больше вхождений регулярного выражения

+

1 или больше вхождений регулярного выражения

?

0 или 1 вхождение регулярного выражения

ab|cd

"ab" или "cd"

Примеры сочетаний:

awk ' $3~/(7[0-9])$/ {print} ' f-awk

Результат:

Петров А.В. 1979 40

Сидоров С.К. 1979 40

Хведоров И.Х. 1970 60

То есть в третьем поле выделить 70-е годы (7 и еще одна цифра от конца поля).

        1. 7. Действия

В awk возможны следующие действия:

  1. присваивания выражений;

  2. операторы управления

  3. операторы вывода;

  4. встроенные функции.

        1. Операторы управления

Простейшие операторы

exit

завершить выполнение программы;

next

перейти к следующей строке, управление на начало awk-программы;

break

выход из цикла;

continue

переход к следующей итерации;

        1. Структурные операторы

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" будет после каждого цикла печатать полные строки.

Соседние файлы в папке материалы к собеседованию