$ awk '{if($6 <= $7) print $1}' grade.txt
M. Tansley
J. Lulu J. Troll
Проверка "больше чем"
Следующая команда формирует список лидеров соревнования:
$ awk '{if ($6 > $7) print $1}' grade.txt
L. Tansley P. Bunny
9.2.7. Логические операторы
Логические операторы позволяют формировать сложные выражения, позволяющие выполнять проверку нескольких условий. Существует три логических оператора:
&& И: чтобы результат был истинным, оба операнда должны быть истинными | | ИЛИ: чтобы результат был истинным, хотя бы один из операндов должен
быть истинным! НЕ: результат проверки инвертируется
Оператор логического И
Предположим, перед нами поставлена задача выяснить, кому был присвоен зеленый пояс в мае 1999 года. Строки, отвечающие этому условию, должны в первом поле содержать значение "05/99", а во втором — "Green":
$ awk '{if($2 == "05/99" && $4 == "Green") print $0}' grade.txt
M. Tansley 05/99 48311 Green 8 40 44
Оператор логического ИЛИ
Чтобы получить список учеников, обладающих желтым или коричневым поясом, воспользуйтесь оператором | |:
$ awk '{if ($4 == "Yellow" ) || $4 ~ /Brown/} print $0}' grade.txt
P. Bunny |
02/99 |
48 |
Yellow |
12 |
35 |
28 |
J. Troll |
07/99 |
4842 |
Brown-3 |
12 |
26 |
26 |
L. Tansley |
05/99 |
4712 |
Brown-2 |
, 12 |
30 |
28 |
Приведенную команду можно упростить с помощью метасимвола, означающего выбор любого из двух шаблонов:
$ awk '$4 ~ /Yellow|Brown/' grade.txt
P. Bunny |
02/99 |
48 |
Yellow |
12 |
35 |
28 |
J. Troll |
07/99 |
4842 |
Brown-3 |
12 |
26 |
26 |
L. Tansley |
05/99 |
4712 |
Brown-2 |
12 |
30 |
28 |
9.2.8. Операторы присваивания и арифметические операторы
С помощью операторов присваивания и арифметических операторов можно создавать в сценариях awk локальные переменные и манипулировать их значениями.
Создание локальных переменных
При разработке сценариев awk не всегда удобно работать с идентификаторами полей. Лучше создать переменную, содержащую значение поля, и присвоить ей выразительное имя, чтобы в дальнейшем ссылаться на поле по имени. Подобную переменную можно получить с помощью конструкции следующего вида:
имя_переменной= $n
где n -cуществующий номер поля.
В следующем примере мы создадим две переменные: name, содержащую имена учеников (поле 1), и belts, содержащую названия поясов (поле 4). Затем будет произведен поиск учеников, обладающих желтым поясом.
$ awk '(name=$1; belts=$4; if(belts ~ /Yellow/) print name" is belt "belts}' grade.txt
P.Bunny is belt Yellow
Обратите внимание на то, что команды сценария отделяются друг от друга точкой с запятой.
Проверка значения поля
В следующем примере мы проверим, кто из учеников набрал в соревнованиях менее 27 очков. В первом варианте команды значение поля $6 непосредственно сравнивается с числом 27:
$ awk '$6 < 27' grade.txt
J.Lulu |
06/99 |
48317 |
green |
9 |
24 |
26 |
J.Troll |
07/99 |
4842 |
Brown-3 |
12 |
26 |
26 |
Более универсальный способ заключается в том, чтобы перед обработкой входного файла, в процедурной части шаблона begin, создать, как в настоящей программе, набор локальных переменных с нужными значениями и ссылаться на них, когда
потребуется. Конечно, этот прием неэффективен в случае одноразовых команд, зато очень полезен в больших сценариях, так как позволяет легко вносить в них изменения. Во втором примере мы создадим переменную baseline и присвоим ей значение 27, а затем сравним с ней интересующее нас поле $6:
$ awk 'BEGIN {BASELINE=27} {if ($6 < BASELINE) print $0}' grade.txt
J.Lulu 06/99 48317 green 9 24 26
J.Troll 07/99 4842 Brown 3 12 26 26
Изменение значения числового поля