М. Tansley | 05/99 | "48311 | Green | 8 | 40 | 44 |
J. Lulu | 06/99 | 48317 | green | 9 | 24 | 26 |
P. Bunny | 02/99 | 48 | Yellow | 12 | 35 | 28 |
J. Troll | 07/99 | 4842 | Brown-3 | 12 | 26 | 26 |
Чтобы найти точное совпадение, воспользуйтесь оператором ==:
$ awk '$3 == "48"' grade.txt
P. Bunny 02/99 48 Yellow 12 35 28
Проверки на несовпадение и неравенство
Иногда требуется извлечь те строки, которые не соответствуют шаблону. Для этих целей предназначен оператор !~, выполняющий проверку на неравенство регулярному выражению. Давайте, например, выведем список всех учеников, не являющихся обладателями коричневого пояса:
$ awk '$0 !~ /Brown/' grade.txt
M. Tansley | 05/99 | 48311 | Green | 8 | 40 | 44 |
J. Lulu | 06/99 | 48317 | green | 9 | 24 | 26 |
P. Bunny | 02/99 | 48 | Yellow | 12 | 35 | 28 |
He забывайте, что по умолчанию утилита awk выводит на экран все записи, отвечающие указанному критерию отбора, поэтому нет необходимости задавать какое‑либо действие. Если вместо предыдущей команды указать
$ awk '$4 != "Brown"' grade.txt
получим ошибочный результат. Эта команда означает, что требуется найти строки, в которых четвертое поле не равно "Brown". Такому критерию удовлетворяют все строки в файле. Конечно, если нужно найти обладателей поясов, отличных от "Brown-2", можно применить следующую команду:
$ awk '$4 != "Brown-2"' grade.txt
M. Tansley | 05/99 | 48311 | Green | 8 | 40 | 44 |
J. Lulu | 06/99 | 48317 | green | 9 | 24 | 26 |
P. Bunny | 02/99 | 48 | Yellow | 12 | 35 | 28 |
S. Trnll | 07/99 | 4842 | Brown-3 | 12 | 26 | 26 |
Обратите внимание на один важный момент: строка "Brown-2" заключена в двойные кавычки. Если этого не сделать, четвертое поле будет сравниваться с содержимым переменной Brown-2. Вряд ли в вашем интерпретаторе существует такая переменная, поэтому вместо нее будет подставлена пустая строга, и вы получите совершенно другой результат.
Проверка "меньше чем"
Допустим, нужно определить, кто из учеников не смог набрать максимального количества очков на соревновании. Для выполнения проверки достаточно сравнить набранный рейтинг (поле 6) с общей суммой возможных очков (поле 7). Также поместим в отчет небольшое сообщение.
$ awk '{if($6 < $7) print $1 " — try better at the next competition"}' grade.txt
M. Tansley — try better at the next competition J. Lulu — try better at the next competition
Проверка "меньше или равно"
Чтобы включить в отчет тех учеников, рейтинг которых не выше значения в седьмом поле, нужно лишь незначительно видоизменить предыдущий пример:
$ 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
Логические операторы позволяют формировать сложные выражения, позволяющие выполнять проверку нескольких условий. Существует три логических оператора:
&& И: чтобы результат был истинным, оба операнда должны быть истинными | | ИЛИ: чтобы результат был истинным, хотя бы один из операндов должен
быть истинным! НЕ: результат проверки инвертируется
Оператор логического И
Предположим, перед нами поставлена задача выяснить, кому был присвоен зеленый пояс в мае 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 |