Составной шаблон комбинирует простые шаблоны с логическими операторами "||" (или), "&&" (и), !(отрицание). Например, нужно напечатать все страны в "Asia" с населением более 500 млн. Следующая программа выполняет выбор всех строк, у которых 4-е поле "Asia" и третье поле превышает 500:
$4 == "Asia" && $3 > 500
Программа:
$4 == "Asia" || $4 == "Africa"
выбирает строки с названиями "Asia" или "Africa" в 4-м поле. Эти же действия можно выполнить с помощью регулярного выражения и альтернативного оператора "|":
$4 ~ /^(Asia|Africa)$/
Оператор отрицания "!" имеет более высокий приоритет, чем "&&" и "||". Операторы "&&" и "||" вычисляются слева направо. Вычисление останавливается, как только истина или ложь будут достигнуты.
Область шаблона состоит из двух шаблонов, разделенных запятой:
pat1, pat2 {...}
В этом случае действие выполняется для каждой строки, расположенной между pat1 и pat2 (включительно). Например, шаблон:
/Canada/, /Brazil/
ищет строки со словом "Canada" до строки со словом "Brazil"
Canada 3852 24 North America China 3692 866 Asia USA 3615 219 North America Brazil 3286 116 South America
Также, если FNR - число текущих записей в текущем вводном файле, FILENAME - имя текущего вводного файла, то программа:
FNR == 1, FNR == 5 {print FILENAME, $0}
печатает первые 5 записей каждого вводного файла с именем FILENAME.
В выражении шаблон-действие, "действие" определяет то, что нужно выполнить с вводными записями, которые отобраны по шаблону. Достаточно часто "действие" - это печать каких-либо выражений, но также может быть комбинацией одного или более выражений.
В табл. 3 приведены встроенные переменные, которые поддерживает awk.
Таблица 3 Встроенные переменные
Переменная
Значение
Умолчание
ARGC
Число аргументов команд ной строки
-
ARGV
Массив аргументовной строки командной строки
-
FILENAME
Имя текущего вводного файла
-
FNR
Номер записи в текущем файле
-
FS
Поле разделителя вводного файла
пробел и/или табуляция
FN
Число полей в текущей записи
-
NR
Число считанных на данный момент записей
-
OFMT
Выводной формат для цифр
%.6g
OFS
Разделитель поля выводного файла
пробел
ORS
Разделитель записи выводного поля
символ новой строки
RS
Разделитель записи вводного файла
то же
RSTART
Индекс первого выбранного символа при помощи match()