Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по ОС.doc
Скачиваний:
17
Добавлен:
05.11.2018
Размер:
2.06 Mб
Скачать

Функции, определенные пользователем

awk поддерживает функции, определенные пользователем:

function имя( список_аргументов) {

операторы

}

Это определение может появляться в любом месте, где возможен оператор "шаблон-действие". Список аргументов - это список имен переменных, разделенных запятыми. Внутри тела функции эти переменные ссылаются на действительные переменные при вызове функции. Между именем функции и левой круглой скобкой не должно быть пробела, иначе это будет означать конкатенацию.

Массив элементов просматривается при обращении, как и в Си. Функция при просмотре не может изменить значение скалярных аргументов. Внутри функции формальные параметры являются локальными переменными, но все другие переменные являются глобальными. У вас может быть любое количество формальных параметров, которые используются только как локальные переменные. Оператор return является необязательным, но если он отсутствует, возвращаемое значение будет неопределенным.

Комментарии

В программе awk могут присутствовать комментарии. Они начинаются с символа # и заканчиваются символом новой строки:

print x,y # это комментарий

Операторы обычно занимают одну строку. Несколько операторов могут располагаться на одной строке, тогда они должны разделяться точкой с запятой. Длинный оператор может располагаться на нескольких строках, причем каждая продолжаемая строка должна заканчиваться символом "\". Нельзя продолжить строку вида "....". Такое продолжение встречается редко, однако как только строка заканчивается запятой, операторы продолжаются автоматически. Примером этого служат операторы print и printf, и такое возможно после операторов "&&" и "||". Несколько операторов "шаблон-действие" могут появляться на одной строке, если они разделены точкой с запятой.

Вывод

Операторы print и printf являются простейшими конструкциями, которые генерируют вывод. Оператор print используется для образования просто вывода; printf - для форматируемого вывода. Подобно shell awk позволяет вам перенаправлять вывод в файл или в канал.

Оператор print

Оператор:

print expr1, rxpr2, ..., exprn

печатает строки каждого выражения, разделенные при помощи разделителей полей и следующими за ними разделителями записей.

Оператор:

print

является сокращенной формой оператора:

print $0

Чтобы напечатать пустую строку, введите:

print ""

Разделители вывода

Разделители полей выводного файла и разделители записей хранятся в строковых переменных OFS и ORS. Первоначально значение OFS устанавливается как один пробел и ORS - один символ новой строки, но эти значения могут быть изменены в любой момент времени. Например, следующая программа печатает первое и второе поле каждой записи, имеющее двоеточие между полями и два символа новой строки после второго поля.

BEGIN { OFS = ":"; ORS = "\n\n" }

{ print $1, $2 }

Обратите внимание, что :

{ print $1 $2 }

печатает первое и второе поле без разделителя полей вводного файла.

Оператор printf

Оператор printf, используемый в awk, подобен этому оператору в Си, за исключением того, что спецификатор * не поддерживается.

Общий формат оператора:

print format expr1, rxpr2, ..., exprn

где format - это строка, содержащая информацию, которая будет печататься, и какое преобразование будет выполняться над выражением.

Каждая спецификация начинается с символа "%", заканчивается буквой, которая определяет преобразование, и может включать: - - выравнивание по левому краю в поле; width - заполнить поле на заданную ширину; поля, начинающиеся с лидирующего нуля, должны быть заполнены нулями; .prec - указывает максимальную ширину строки или разряд справа от десятичной точки.

В табл.6 приведен список символов преобразования printf.

Таблица 6 Символы преобразования printf

Символ

Вид печати выражения

c

Один символ

d

Десятичное число

e

[-]d.ddddddE[+-]dd

f

[-]ddd.dddddd

g

e или f преобразование с подавленем незначащих нулей

o

Беззнаковое восьмиричное число

s

Строка

x

Беззнаковое шестнадцатиричное число

%

Печать %; нет аргументов для преобразования

Примеры оператора printf с соответтвующим выводом на той же строке.

printf "%d", 99/2 49

printf "%s", 99/2 4.950000e+01

printf "%f", 99/2 49.500000

printf "%6.2f", 99/2 49.50

printf "%g", 99/2 49.5

printf "%o", 99 143

printf "%06o", 99 000143

printf "%x", 99 63

printf "|%10s|", "January" | January|

printf "|%-10s|", "January" |January |

printf "|%.3s|", "January" |Jan|

printf "|%10.3s|", "January" | Jan|

printf "|%-10.3s|", "January" |Jan |

printf "%%" %

По умолчанию формат чисел выводного файла %.6g. Он может быть изменен, если вы зададите новое значение OFMT. OFMT также управляет преобразованием цифровых значений в строковые при конкатенации и создании массива индексов.

Вывод в файлы

В качестве стандартного вывода для печати можно использовать файлы. Для этого используются операторы изменения направления > и >>. Например, следующая программа вызывает печать из файла countries всех строк, в которых 3-е поле (население) больше, чем 100, в файл bigpop и все остальные строки в файл smallpop:

$3 > 100 { printf $1, $3 > "bigpop" }

$3 > 100 { printf $1, $3 > "smallpop" }

Обратите внимание, что имена файлов заключены в двойные кавычки; без кавычек bigpop и smallpop будут просто неустановленными переменными. Если имена выводных файлов создаются с помощью выражения, они должны быть заключены в круглые скобки:

$4 ~ /North America/ { print $1 > ("tmp" FILENAME) }

так как оператор > имеет более высокий приоритет, чем конкатенация. Без круглых скобок конкатенация tmp и FILENAME не будет производиться.

Примечание. Файлы в программе awk открываются один раз. Если файл открыт с помощью >>, его содержимое сохраняется и вывод дополняется в файл.

Вывод в канал

Вы можете направить печать в канал.

Оператор:

print | "командная_строка"

направляет вывод в "командную_строку". Хотя канал здесь показан как строковая переменная, заключенная в двойные кавычки, командная строка и имена файлов могут приходить из переменных и возвращать значения из функций.

Предположим, вы хотите создать список страна-население так, чтобы страны были отсортированы по алфавиту. Программа awk накапливает значение "количество населения" из 3-го поля для каждого названия страны из 4-го поля и вывод направляет в массив pop. Затем print название каждой страны и ее население направляет вывод команде sort:

BEGIN { FS "\t" }

{ pop [$4] += $3 }

END { for ( c in pop )

print c ":" pop[c] | "sort" }

В результате работы этой программы получим:

Africa:37

Asia:1765

Australia:14

North America:243

South America:142

Во всех этих операторах print, вызывающих перенаправление вывода, файлы или каналы идентифицируются с помощью имен (так, канал в данном примере называется "sort"), но они создаются и открываются один раз при запуске. Так что в последнем примере для всех "c" в "pop" открывается только один канал "sort".

Существует ограничение на число файлов, которые могут быть открыты одновременно. Оператор close (файл) закрывает файл или канал.

Когда открывается или закрывается файл, различные строки являются различными командами.

Ввод

Наиболее общим способом подачи ввода программе awk является указание в командной строке имен вводных файлов. Но существуют и другие способы. Они описываются в этом подразделе.