Разделитель полей, который является либо отдельным символом либо регулярным выражением, определяет способ разделения входной записи на поля. awk сканирует входную запись в поисках последовательности символов, соответствующей разделителю полей; сами поля представляют текст между разделителями.
В дальнейших примерах мы используем маркирующий символ "ffl" для представления пробелов в выходе. Если разделитель полей есть `oo', то следующая строка:
moo goo gai pan
разбивается на три поля: `m', `fflg' и `fflgaifflpan'. Отметим ведущие пробелы в значениях второго и третьего полей. Разделитель полей представляется встроенной переменной FS. Системные программисты, обратите внимание! В awk не используется имя IFS, используемое оболочками, совместимыми с POSIX (такими как Bourne shell, sh, или GNU BourneAgain Shell, Bash).
В awk-программе можно менять значение FS оператором присваивания, `=' (см. раздел 7.7 [Присваивающие выражения], стр. 84). Часто это удобно делать в начале выполнения, перед началом обработки ввода, так что самая первая запись будет читаться с правильным разделителем. Чтобы это сделать, используйте специальный образец BEGIN (см. раздел 8.1.5 [Специальные образцы BEGIN и END], стр. 100).
Например, здесь мы присваиваем FS значение цепочки ",":
awk 'BEGIN - FS = "," "" ; - print $2 ""'
Из входной строки
John Q. Smith, 29 Oak St., Walamazoo, MI 42139
эта awk-программа извлечет и напечатает цепочку
`ffl29fflOakfflSt.'.
Иногда входные данные содержат разделительные символы, которые не разделяют поля таким образом, как вы полагаете, что они должны разделять. Например, личное имя в предыдущем примере может иметь добавкой титул или суффикс, такой как `John Q. Smith, LXIX'. Для входной записи с таким именем: John Q. Smith, LXIX, 29 Oak St., Walamazoo, MI 42139 предыдущая программа извлечет `fflLXIX' вместо `ffl29fflOakfflSt.'. Если вы ожидаете, что программа напечатает адрес, вы будете очень удивлены. Мораль такова: выбирайте структуру данных и символы-разделители тщательно, чтобы предотвратить подобные случаи.
Как вы знаете, по умолчанию поля разделяются последовательностями белых пробелов (т.е. (пробелами, знаками tab и newline), но не единичными пробелами: два пробела подряд не ограничивают пустое поле. По умолчанию разделитель полей FS имеет значение цепочки, содержащей один пробел " ". Если бы это значение интерпретировалось обычным путем, т.е. каждый пробел считался разделителем полей, то два пробела подряд содержали бы между собой пустое поле. Этого не происходит, потому что единственный пробел в качестве значения FS представляет специальный случай: он означает разделение полей по умолчанию. Если FS имеет значением какой-нибудь другой отдельный символ, такой как ",", то каждое вхождение этого символа разделяет два поля. Два последовательных вхождения ограничивают пустое поле. Если символ стоит в начале или конце строки, то тоже отделяет пустое поле. Символ пробела есть единственный одиночный символ, который не подчиняется этим правилам.