Операционная система UNIX. Руководство программиста

       

Встроенные функции


Предоставляемая awk'ом функция length позволяет вычислить длину цепочки символов. Следующая программа печатает длину и содержимое каждой записи:

{ print length, $0 }

В данном случае length эквивалентно length($0), что обозначает длину текущей записи. В общем случае, length (x) возвращает длину аргумента x, трактуемого как цепочка символов.

При использовании countries в качестве входного файла, следующая программа напечатает самое длинное название страны:

length ($1) > max { max = length ($1); name = $1 } END { print name }

Функция split в форме

split (s, array)

присваивает поля цепочки s последовательным элементам массива array. Например, обращение

split ("Now is the time", w)

присваивает значение Now элементу w[1], is - w[2], the - w[3], time - w[4]. Все другие элементы массива w[] устанавливаются равными пустой цепочке. Можно указать, что роль разделителя полей должен играть не пробел, а другой символ. В таком случае используется иная форма функции split, с тремя аргументами:

n = split (s, array, sep)

Данный вызов разбивает цепочку s на поля и помещает их в array[1], ..., array[n]. Результат, возвращаемый split, равен числу обнаруженных полей. Если аргумент sep указан, задаваемая им цепочка используется в качестве разделителя полей; в противном случае используется FS. Это бывает удобно, если требуется в середине awk-программы переопределить для одной записи разделитель полей.

Кроме того, awk предоставляет математические функции



sqrt log exp int

Это функции вычисления квадратного корня, натурального логарифма, экспоненты и целой части числа. Последняя функция возвращает максимальное целочисленное значение, не превосходящее значения аргумента. Перечисленные функции заимствуются из математичекой библиотеки языка C (awk-функции int соответствует функция floor библиотеки libm), поэтому в случае ошибки они возвращают такие же результаты, что и их аналоги из libm (см. Справочник программиста).

Функция substr в форме

substr (s, m, n)

возвращает подцепочку цепочки s, начинающуюся с позиции m и содержащую не более n символов. Если третий аргумент (в данном случае - n) отсутствует, выделяется подцепочка до конца s. Например, программа


{ $1 = substr ($1, 1, 3); print }

позволяет сократить названия стран в файле countries:

Rus 8650 262 Asia Can 3852 24 North America Chi 3692 866 Asia USA 3615 219 North America Bra 3286 116 South America Aus 2968 14 Australia Ind 1269 637 Asia Arg 1072 26 South America Sud 968 19 Africa Alg 920 18 Africa

Если s - число, substr использует его текстовое представление:

substr (123456789, 3, 4) = 3456

Функция

index (s1, s2)

возвращает номер начальной позиции первого вхождения цепочки s2

в цепочку s1, либо нуль, если цепочка s2 не входит в цепочку s1.

Функция sprintf форматирует выражения так же, как это делает оператор printf, однако не отправляет результат на стандартный вывод, а присваивает его некоторой переменной. Например, оператор

x = sprintf ("%10s %6d", $1, $2)

присваивает переменной x цепочку символов, полученную форматным преобразованием значений $1 и $2, после чего x можно использовать в последующих вычислениях.

Функция getline немедленно читает следующую входную запись. Значения полей, переменных $0 и NR переустанавливаются, однако управление остается в том же самом месте awk-программы. getline возвращает 0, если обнаружен конец файла, и 1, если считана обычная запись.




Содержание раздела