
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