Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод_ПСРВ.doc
Скачиваний:
26
Добавлен:
12.02.2016
Размер:
1.6 Mб
Скачать

1.4. Awk-переменные и выражения

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

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

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

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

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

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

  • массив.

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

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

  • если "+", то числа с плавающей точкой.

Примеры:

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

Результат:

198050

197940

197940

197060

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

Результат:

2030

2019

2019

2030

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

Результат:

И.И. 1980

А.В. 1979

С.К. 1979

И.Х. 1970

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

Результат:

А.В. 1979

И.Х. 1970

Существует два оператора специального вида ("BEGIN"-начальные установки и "END" - "последействия"):

BEGIN {действие}

шаблон {действие}

шаблон {действие}

. . .

END {действие}

Примеры

awk '{}

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

Результат:

4

awk '{}

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

Результат:

4

awk '{}

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

Результат:

2

awk '{}

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

Результат:

0

awk '{}

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

Результат:

4.2

1.5. Использование операций

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.6. Использование массивов

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

John 100

Mary 200

Mary 200

John 100

John 300

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

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

John100

Mary200

Mary400

John200

John500

1.7. Селекторы

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

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

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

  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

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

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

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

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

awk '$1=="Иванов" {print} ' f-awk

Результат:

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

awk '$4/2==30 {print} ' f-awk

Результат:

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

3) awk '$3 != $4 && $3 > 1970 {print} ' f-awk

Результат:

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

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

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

4) awk '$1~/нов$/ {print} ' f-awk

Результат:

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

5) awk '/^Ив|дор/ {print} ' f-awk

Результат:

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

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

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

6) awk '/1980/,/1979/ {print} ' f-awk

Результат:

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

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