направляет вывод в "командную_строку". Хотя канал здесь показан как строковая переменная, заключенная в двойные кавычки, командная строка и имена файлов могут приходить из переменных и возвращать значения из функций.
Предположим, вы хотите создать список страна-население так, чтобы страны были отсортированы по алфавиту. Программа awk накапливает значение "количество населения" из 3-го поля для каждого названия страны из 4-го поля и вывод направляет в массив pop. Затем print название каждой страны и ее население направляет вывод команде sort:
BEGIN { FS "\t" }
{ pop [$4] += $3 }
END { for ( c in pop )
print c ":" pop[c] | "sort" }
В результате работы этой программы получим:
Africa:37
Asia:1765
Australia:14
North America:243
South America:142
Во всех этих операторах print, вызывающих перенаправление вывода, файлы или каналы идентифицируются с помощью имен (так, канал в данном примере называется "sort"), но они создаются и открываются один раз при запуске. Так что в последнем примере для всех "c" в "pop" открывается только один канал "sort".
Существует ограничение на число файлов, которые могут быть открыты одновременно. Оператор close (файл) закрывает файл или канал.
Когда открывается или закрывается файл, различные строки являются различными командами.
Наиболее общим способом подачи ввода программе awk является указание в командной строке имен вводных файлов. Но существуют и другие способы. Они описываются в этом подразделе.
Вы можете поместить вводимые данные в файл, указать awkdata и затем выполнить:
awk 'программа' awkdata
Если не указано имя файла, то awk читает из стандартного файла ввода. Например, egrep выбирает вводные строки, содержащие указанное регулярное выражение, которое может сделать это быстрее, чем awk, т.к. выполняет только это действие. И мы можем вызвать кроме того канал:
egrep 'Asia' countries | awk '...'
egrep быстро находит строки, содержащие "Asia" и затем направляет их программе awk для последующей обработки.
Если используется значение по умолчанию для разделителей полей FS, то поля вводного файла разделяются символами пробела или табуляции и лидирующие символы пробелов отбрасываются, так что каждая из этих строк имеет следующее первое поле:
поле 1 поле 2 поле 1 поле 1
Если в качестве разделителя полей используется символ табуляции, то лидирующие пробелы не отбрасываются.
Разделитель поля может быть установлен при помощи регулярного выражения при присвоении значения встроенной переменной FS.
Например:
BEGIN { FS = ",[\t] * | ([\t]+" }
переделывает разделитель поля каждой строки в запятую и следующий за ней символ новой строки или табуляции, и каждую строку с символами пустой строки или табуляции без запятой. FS может быть установлен в командной строке с аргументом -F:
Пример.
awk -F ' (, [\t]*) | ([\t]+)' '...'
а выполняет те же действия, что и в предыдущем примере.
Регулярные выражения используются как разделители поля для поиска самых длинных строк (как в sub()), но не нулевых строк.
Обычно записи разделяются символами новой строки, так что каждая строка яавяется записью. Такой порядок можно изменить. Если пременная RS - разделитель встроенных записей - установлен в значение "пустая строка", как в:
BEGIN { RS = "" }
то записи вводного файла могут занимать несколько строк. Последовательность пустых строк разделяет записи. Для обработки многострочных записей в общем случае может использоваться:
BEGIN { RS = ""; FS = "\n" }
установка в качестве разделителя записи символ пустой строки и разделителя поля - символ новой строки. Таким образом, каждая строка является одним полем. Однако длина записи ограничена (обычно 2500 символов).