2. Вызов awk

Возможны два основных варианта:

1)awk [-Fc] 'prog.awk' [files]

Это простейший случай, когда программа (заключенная в кавычки " ' ") находится в теле команды, "-Fc" - флаг, меняющий стандартный разделитель полей на "c" "file" - имя файла исходных данных, при его отсутствии - со стандартного входа. (Этот формат использован в начальных примерах).

cat f-awk | awk '/до/ {print}'

и

awk '/до/ {print}' < f-awk

дают результат, аналогичный

awk '/до/ {print}' f-awk

Для демонстрации действия флага "-Fc" рассмотрим вызовы:

awk '/до/ {print($2)}' f-awk awk -F0 '/до/ {print($2)}' f-awk На экран будет выведено:

С.К.

И.Х.

6

Первая команда "awk" выведет вторые поля (благодаря позиционной переменной "$2") строк, содержащие "до". (Кстати, позиционная переменная "$0" соответсвует всей строке). Во втором случае, благодаря флагу "-F" стандартные разделители заменены на символ "0", т.е. теперь выбранные строки воспринимаются, как разбитые на следующие поля:

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

---------------------^--------------------

1-е поле 2-е поле (пусто) Хведоров И.Х. 1970 60

-----------------^---^--------------------

1-е поле 2-е 3-е поле (пусто)

2) awk [-Fc] -f prog.awk [files]

Флаг "-f" говорит о том, что awk-программу надо брать из файла, имя которого указано следом (имя может быть произвольным и расширение ".awk" добавлено здесь просто из эстетических соображений).

3. awk-переменные и выражения

В языке awk выделяются две группы переменных: предопределенные и декларированные в программе. Исходные значения предопределенных переменных устанавливаются интерпретатором awk в процессе запуска и выполнения awk-программы.

К предопределенным относятся:

Умолчания:

NR - номер текущей строки

 

NF - число полей в текущей строке

 

RS - разделитель строк на вводе

"\0"

FS - разделитель полей на вводе

пробел и/или табуляция

ORS - разделитель строк на выводе

RS

OFS - разделитель полей на выводе

FS

OFMT - формат вывода чиcл

"%.6g"

FILENAME - имя входного файла.

Прочим переменным пользователь может присваивать начальные значения. По умолчанию "0" или пустая строка (что здесь равнозначно!).

Типы переменных:

позиционные,

числа с плавающей точкой,

строка символов,

массив.

Интерпретатор awk рассматривает переменную как строковую, пока не возникает необходимость выполнить операции:

если пробел (конкатенация), то строки;

если "+", то числа с плавающей точкой. Примеры:

1.awk '{a = $3 $4; print a}' f-awk

awk '{a = $3+$4; print a}' f-awk

Результат:

198050

197940

197940

197060

2030

2019

2019

2030

2. awk '{}

END {a = 2 + 2 ; print a}' < f-awk awk '{}

END {a = 2 + "2" ; print a}' < f-awk awk '{}

END {a = 2 + "два" ; print a}' < f-awk awk '{}

END {a = "два"+"два" ; print a}' < f-awk awk '{}

END {a = 2.2 + 2.000 ; print a}' < f-awk

Результат:

4

4

2

0

4.2

Массив не об'является, а начинае существовать в момент первого использования. Индекс массива - любое ненулевое значение или строка. Массивы ассоциативные, т.е. не по вычисляемому индексу, а по совпадению содержания, например:

day [Jan][31] = Mon day [Feb][01] = Tue day [Feb][02] = Wed

Массивы удобно использовать при суммированиях, например записи выплат имеют вид (файл "p-1"):

John 100

Mary 200

Mary 200

John 100

John 300

awk '{sum[$1] += $2; print $1 sum[$1]} ' < p-1

Результат (поименный нарастающий итог):

John100

Mary200

Mary400

John200

John500

 

 

 

 

 

 

Операции как в Си

 

=, +=, -=, *=, /=, %=, +, /, %, ++, --.

 

 

 

 

 

 

 

Сравнения чисел, если оба числа, иначе - строк

 

<, <=, ==, !=, >=, >

 

 

 

 

 

 

 

Логические операции

 

!, ||, &&

 

 

 

 

 

 

 

Операция "пробел"

 

конкатенация.

 

 

 

 

 

 

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

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 и еще одна цифра от конца поля).

7. Действия

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

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

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

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

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

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