Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операционная система UNIX.doc
Скачиваний:
94
Добавлен:
01.05.2014
Размер:
1.67 Mб
Скачать

10.26.2. Дополнительные примеры

10.26.2.1. Частота использования слов

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

{ for ( w = 1; w <= NF; w++ ) count[$w]++ }

END {for( w in count) print count[w], w | " sort -nr" }

Первый оператор использует массив count для накопления количества появлений каждого слова. Как только ввод будет считан, второй оператор цикла for направляет окончательный счетчик каждого слова команде sort.

10.26.2.2. Накопление

Предположим вы имеете два файла deposite и withdrawals, записи которых содержат имя поля и количество полей. Для каждого имени вы хотите напечатать итог net, определяющийся вычитанием общего вывода из общего депозита. Баланс net может быть вычислен следующей программой:

awk '

FILENAME == "deposits" { balance[$1] += $2 }

FILENAME == "withdrawals" { balance[$1] -= $2 }

END { for (name in balance )

print name, balance[name]

}' deposits withdrawals

Первый оператор использует массив balance для накопления общего количества для каждого имени в файле deposits. Второй оператор вычитает соответствующий вывод из каждого общего депозита. Оператор END печатает каждое имя с соответствующим итогом.

10.26.2.3. Случайный выбор

Следующая функция печатает случайные элементы k, начиная с первого элемента массива A, состоящего из n элементов. В программе k - это количество входов, необходимых для печати, n - количество элементов, которые еще будут исследоваться. Выбор печатать или нет i-тый элемент определяется тестом rand() < k/n:

function choose (A, k, n, i) {

for (i = 1; n > 0; i++)

if (rand() < k/n--) {

print A[i]

k--

}

}

}

10.26.2.4. Возможности shell

Следующая программа awk приблизительно моделирует возможности shell системы UNIX. Строка, содержащая только знак "=" заново выполняет последнюю выполненную команду. Строка, начинающаяся с =cmd заново выполняет последнюю команду, вызов которой включает строку cmd. Иначе выполняется текущая строка.

$1 == "=" { if [NR == 1]

system ( x[NR] = x [NR-1] )

else

for ( i= NR-1]; i > 0; i-- )

if ( x[i] ~ $2 ) {

system(x[NR] = x[i])

break

}

next }

/./ { system(x[NR] = $0) }

10.27. Итоговое краткое описание awk

Командная строка

awk programm filenames

awk -f programm-file filenames

awk -Fs sets field separator to string s

awk -Ft sets separator to tab

Шаблоны

BEGIN

END

/regular expression/

relational expression

pattern && pattern

pattern || pattern

(pattern)

!pattern

pattern, pattern

Операторы управления потоком

if (expr) statement [else statement]

if (subscript in array) statement [else statement]

while (expr) statement

for (expr; expr; expr) statement

for (var in array) statement

do statement while statement

break

cintinue

next

exit [expr]

return [expr]

Ввод-вывод

close (filename)

закрыть файл

getline

установить $0 из следующей вводной записи; установить NF, NR, FNR

getline <file

установить $0 из следующей записи файла; установить NF

getline var

установить var из следующей вводной записи; установить NR, FNR

getline var <file

установить var из следующей записи файла

print

распечатать текущую запись

print expr-list

распечатать выражение

print expr-list >file

печать выражений в файл

printf fmt, expr-list

отформатировать и распечатать

printf fmt, expr-list >file

отформатировать и распечатать в файл

system (cmd-line)

выполнить команду cmd-line, возвратить состояние

В print и printf >>file добавляется в file и |command - записывает в канал.

Функции

func name(parameter list) { statement }

function name(parameter list) { statement }

function-name(expr, expr, ...)

Функции строки

gsub(r,s,t)

заменить строку s для каждого найденного регулярного выражения r в строке t; возвращает количество замен; если t опущено, то используется $0

index(s,t)

возвращает индекс строки t в строке s, или 0, если нет вхождений строки t

length(s)

возвращает длину строки s

match(s,r)

возвращает позицию s, в которой встретилось регулярное выражение r; возвращает 0, если r не найдено

split(s,a,r)

разбить строку s в массив a по регулярному выражению r; возвращает количество полей; если r опущено, то используется значение FS

sprints(fmt,expr-list)

печатает expr-list в соответствии с fmt, возвращает результирующую строку

sub(r,s,t)

аналогично gsub, за исключением того, что заменяется только первая найденная подстрока

substr(s,i,n)

возвращает подстроку n, начинающуюся с i; если n опущено, то используется остаток s

Арифметические функции

atan2(y,x)

арктангенс y/x в пределах от "-пи" до "пи"

cos(x)

косинус x

exp(x)

экспоненциальная функция x

int(x)

целая часть x с усеченными лидирующими нулями

log(x)

натуральный логарифм x

rang()

случайное число между 0 и 1

sin(x)

синус x

sqrt(x)

квадрат x

srand(x)

x - новое начальное значение для rand()

Операторы

= += -= *= /= %= ^=

присвоение

?:

условное выражение

||

логическое OR

&&

логическое AND

~ !~

поиск регулярного выражения; отрицательный поиск

< <= > >= != ==

отношения

blank

конкатенация строк

+ -

сложить, вычесть

* / %

умножить, разделить, режим

+ - !

унарный плюс, унарный минус, логическое отрицание

^

показательная функция ( ** является синонимом)

++ --

приращение, отрицательное приращение

$

поле

Регулярные выражения

с

поиск на совпадение с немета-символом "c"

поиск буквенного символа "с"

^

поиск начала строки или последовательности строк

$

поиск конца строки или последовательности строк

.

поиск любого символа, кроме символа новой строки

[s]

поиск любого символа из набора "s"

[^s]

поиск любого символа, отличного от "s" и символа новой строки

r*

поиск ноль или больше

r+

поиск одного или больше

r?

поиск ноль или один

(r)

группирование: поиск r

r1r2

конкатенация: поиск r1 затем r2

r1|r2

поиск либо r1 либо r2

Встроенные переменные

ARGC

число аргументов командной строки

ARGV

массив аргументов командной строки

FILENAME

имя текущего вводного файла

FNR

номер записи в текущем файле

FS

разделитель поля вводного файла; (по умолчанию - пробел)

FN

число полей в текущей записи

NR

число считанных на данный момент записей

OFMT

выводной формат для цифр; (по умолчанию - %6.g)

OFS

разделитель поля выводного файла

ORS

разделитель записи выводного поля

RS

разделитель записи вводного файла

RSTART

индекс первого выбранного символа при помощи match(); 0 - если символ не найден

RLENGTH

длина строки, выбранной при помощи match() -1 - если строка не найдена

SUBSEP

разделитель индексов элементов массива; (по умолчанию - \034)

Соседние файлы в предмете Операционные системы