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

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