Переменная fnr хранит номер записи, которую утилита awk обрабатывает в текущий момент; ее значение меньше или равно значению переменной NR, которая отслеживает общее число обработанных записей входного потока. Если сценарий получает доступ более чем к одному файлу, переменная FNR сбрасывается в ноль при открытии каждого нового файла. В переменную NF записывается количество полей текущей записи. Ее значение сбрасывается по достижении конца записи.

Переменная FS содержит символ, используемый в качестве разделителя полей входного потока. Эту переменную можно установить из командной строки с помощью опиии -F. По умолчанию разделителем полей служит пробел. Переменная ofs содержит символ, являющийся разделителем полей в выходном потоке. По умолчанию это тоже пробел.

В переменной ORS хранится разделитель записей в выходном потоке. По умолчанию им является символ новой строки (\n). Переменная RS содержит разделитель записей во входном потоке (в большинстве случаев это тоже символ \n).

Переменные NF, NR и FILENAME

Представленная ниже команда позволяет быстро определить число записей во входном файле grade.txt. Значение переменной NR отображается по завершении обработки файла.

$ awk 'END {print NR}' grade.txt

В следующем примере на экран выводятся все записи исходного файла. Каждой из них предшествуют два числа: количество полей в записи (переменная NF) и номер записи в файле (переменная nr). В самом конце отображается имя входного файла (переменная FILENAME).

$ awk '{print NF, NR, $0} END {print FILENAME}' grade.txt

1M. Tansley05/9948311Green84044
2J. Lulu06/9948317green92426
3P. Bunny02/9948Yellow123528
4J. Troll07/994842Brown-3122626
5L. Tansley05/99,4712Brown-2123028

grade.txt

Переменную NF удобно использовать, когда требуется извлечь из путевого имени последнюю часть, т. е. имя файла или каталога. В этом случае необходимо указать, что разделителем полей является символ '/' и использовать ссылку $NF, которая является обозначением последнего поля текущей записи. Например:

$ pwd

/usr/local/etc

$ echo $PWD | awk -F/ '{print $NF}'

Переменная среды $PWD хранит путевое имя текущего каталога.

<p><emphasis><strong>9.2.10. Встроенные функции работы со строками</strong></emphasis></p>

Утилита awk располагает набором универсальных функций преобразования строк. В табл. 9.4 перечислены основные из них.

Таблица 9.4. Функции работы со строками

ФункцияНазначение
gsub(r,.s)Выполняет глобальную замену каждой строки, соответствующей регулярному выражению г, строкой s в пределах текущей записи; появилась в nawk
index(s, t)Возвращает позицию первого вхождения подстроки t в строку s
length(s)Возвращает длину строки s
match(s, r)Проверяет, содержит ли строка s подстроку, соответствующую, регулярному выражению r; появилась в nawk
split(s, a,fs)Разбивает строку s на элементы, разделенные символом fs, и помещает полученные элементы в массив а
sub(r, s)Выполняет замену самой первой строки, соответствующей регулярному выражению r, строкой s в пределах текущей записи; появилась в nawk
substr(s, p[,n])Возвращает подстроку строки s, начинающуюся с позиции p и имеющую длину n; если аргумент п не задан, концом подстроки считается символ \0 (признак конца строки)

Функция gsub()

Благодаря функции gsub() вы сможете выполнить в текущей записи глобальную замену строк, соответствующих заданному регулярному выражению. Например, для изменения номера ученика с 4842 на 4899 введите такую команду:

$ awk 'gsub(4842,4899) {print $0}' grade.txt

J. Troll 07/99 4899 Brown-3 12 26 26

Функция index()

Чтобы узнать позицию первого вхождения подстроки t в строку s, воспользуйтесь функцией index (), только не забудьте взять ее аргументы в двойные кавычки, иначе они будут восприниматься как имена переменных среды. Например, следующая команда возвращает число, определяющее позицию подстроки "ny" в строке "Bunny":

Перейти на страницу:

Похожие книги