Руководство пользователя для GNU Awk
13. Функции, определенные пользователем
13.2 Примеры определения функций
Вот определение пользовательской функции с именем myprint, которая берет число и печатает его в указанном формате.
function myprint(num) -
printf "%6.3g"n", num ""
Приведем для иллюстрации awk-правило, которое использует эту функцию:
$3 ? 0 - myprint($3) ""
Эта программа печатает в специальном формате все третьи поля, которые содержат положительное число. Поэтому, если дано:
1.2 3.4 5.6 7.8 9.10 11.12 -13.14 15.16 17.18 19.20 21.22 23.24
то эта программа, используя нашу функцию для форматирования результата, напечатает:
5.6 21.2
Следующая функция вычеркивает все элементы массива.
function delarray(a, i) -
for (i in a)
delete a[i] ""
При работе с массивами часто нужно вычеркивать все элементы некоторого массива и начинать с начала с новым списком элементов (см. раздел 11.6 [Оператор delete], стр. 128). Вместо повторения такого цикла всюду в программе, everywhere где вы хотите очистить массив, можно просто вызывать delarray.
Приведем пример рекурсивной функции. Она берет цепочку в качестве входного параметра и возвращает цепочку в обратном порядке.
function rev(str, start) -
if (start == 0)
return ""
return (substr(str, start, 1) rev(str, start - 1)) ""
Если эта функция находится в файле с именем `rev.awk', мы можем проверить ее следующим образом:
$ echo "Don't Panic!"
-- ? gawk --source '- print rev($0, length($0)) ""' -f rev.awk
a !cinaP t'noD
Вот пример, где используется встроенная функция strftime. (См. раздел 12.5 [Функции для действий с отметками времени], стр. 148, для подробной информации о strftime.) Функция ctime в Си получает timestamp и возвращает ее в хорошо известной форме. Здесь приведена ее awk-версия:
# ctime.awk # # awk-версия функции ctime(3) в Си
function ctime(ts, format) -
format = "%a %b %d %H:%M:%S %Z %Y" if (ts == 0)
ts = systime() # по умолчанию используется текущее время
return strftime(format, ts) ""
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|