grade.txt
Переменную NF удобно использовать, когда требуется извлечь из путевого имени последнюю часть, т. е. имя файла или каталога. В этом случае необходимо указать, что разделителем полей является символ '/' и использовать ссылку $NF, которая является обозначением последнего поля текущей записи. Например:
$ pwd
/usr/local/etc
$ echo $PWD | awk -F/ '{print $NF}'
Переменная среды $PWD хранит путевое имя текущего каталога.
9.2.10. Встроенные функции работы со строками
Утилита 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":
$ awk 'BEGIN {print index("Bunny","ny")}' grade.txt
4
Функция length()
Функция length() возвращает длину переданного ей текстового аргумента. В показанном ниже примере производится поиск информации об ученике с номером 4842, а затем определяется длина имени ученика:
$ awk '$3=4842 {print length($1)" "$1}' grade.txt
7 J.Troll
Следующая команда демонстрирует применение утилиты awk для вычисления длины текстовой строки:
$ awk 'BEGIN {print length("A FEW GOOD MEN")}'
14
Функция match()
Функция match() позволяет проверить, содержит ли строка заданную подстроку. Последняя может быть представлена как литералом в двойных кавычках, так и регулярным выражением. Если поиск прошел успешно, возвращается число, определяющее позицию, с которой начинается вхождение подстроки в искомую строку. В случае неудачи возвращается ноль. Следующая команда проверяет, содержит ли имя ученика с номером 48317 символ 'u':
$ awk '$3=48317 {print match ($1, "u"), $1} ' grade.txt
4 J. Lulu
Функция split()
Функция split() преобразует переданную ей строку в массив и возвращает число элементов в полученном массиве. В следующем примере заданная строка разбивается на три элемента, которые помещаются в массив myarray. Разделителем элементов в данном случае является символ '#'.
$ awk 'BEGIN {print split("123#456#678", myarray,"#"))'
3
Массив myarray будет иметь такую структуру:
mуarray[1]="123" myarray[2]="4 56"
myarray[3]="678"
Функция sub()
Функция sub() применяется для поиска строки, соответствующей заданному шаблону, и ее замены при первом появлении. В этом состоит отличие данной функции от функции gsub(), которая находит все случаи вхождения подстроки в строку, производя соответствующее число замен. Приведенная ниже команда находит запись ученика J. Troll и меняет его рейтинг с 26 на 29 (поле 6), при этом значение поля 7 (тоже 26) остается неизменным:
$ awk '$1=="J. Troll" {sub(26,29,$0) )' grade.txt
J. Troll 07/99 4842 Brown-3 12 29 26
Функция substr()
Функция substr() возвращает указанную часть строки. Вам нужно задать позицию, с которой начинается вхождение подстроки в искомую строку, и длину подстроки. Рассмотрим пример: