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

10.10. Комбинация шаблонов

Составной шаблон комбирирует простые шаблоны с логическими операторами "||" (или), "&&" (и), !(отрицание). Например, нужно напечатать все страны в "Asia" с населением более 500 млн. Следующая программа выполняет выбор всех строк, у которых 4-е поле "Asia" и третье поле превышает 500:

$4 == "Asia" && $3 > 500

Программа:

$4 == "Asia" || $4 == "Africa"

выбирает строки с названиями "Asia" или "Africa" в 4-м поле. Эти же действия можно выполнить с помощью регулярного выражения и альтернативного оператора "|":

$4 ~ /^(Asia|Africa)$/

Оператор отрицания "!" имеет более высокий проиритет, чем "&&" и "||". Операторы "&&" и "||" вычисляются слева направо. Вычисление останавливается как только истина или ложь будут достигнуты.

10.11. Область шаблона

Область шаблона состоит из двух шаблонов, разделенных запятой:

pat1, pat2 {...}

В этом случае действие выполняется для каждой строки, расположенной между pat1 и pat2 (включительно). Например, шаблон:

/Canada/, /Brazil/

ищет строки со словом "Canada" до строки со словом "Brazil"

Canada 3852 24 North America

China 3692 866 Asia

USA 3615 219 North America

Brazil 3286 116 South America

Также, если FNR - число текущих записей в текущем вводном файле, FILENAME - имя текущего вводного файла, то программа:

FNR == 1, FNR == 5 {print FILENAME, $0}

печатает первые 5 записей каждого вводного файла с именем FILENAME.

10.12. Действие

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

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

В табл. 23 приведены встроенные переменные, которые поддерживает awk.

Таблица 23 Встроенные переменные

Переменная

Значение

Умолчание

ARGC

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

-

ARGV

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

-

FILENAME

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

-

FNR

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

-

FS

Поле разделителя вводного файла

пробел и/или табуляция

FN

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

-

NR

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

-

OFMT

Выводной формат для цифр

%.6g

OFS

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

пробел

ORS

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

символ новой строки

RS

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

то же

RSTART

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

-

RLENGTH

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

-

SUBSEP

Нижний разделитель

"\034"

10.12.1. Арифметические действия

В качестве действия могут использоваться уловные арифметические выражения, чтобы вычислить числовые значения. В качестве простого примера предположим, что нужно напечатать плотность населения для каждой страны в файле countries. Так как второе поле - это площадь в тысячах квадратных километров, а третье поле - это население в миллионах, то выражение:

100 * $3 / $2

дает плотность населения на 1 квадратный километр.

Программа:

{print "%10s %6.1f\n", $1,

1000 *$3 / $2}

печатает название страны и плотность населения:

USSR 30.3

Canada 6.2

China 234.6

USA 60.6

Brazil 35.3

Australia 4.7

India 502.0

Argentina 24.3

Sudan 19.6

Algeria 19.6

Арифметические действия выполняются с плавающей точкой. Арифметическими операторами являются:

+, -, *, /, %, ^

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

v = e

где v - переменная или имя поля; e - выражение.

Например, чтобы вычислить число стран континента "Asia" и общее количество населения, вы должны написать:

$4 == "Asia" { pop = pop = $3; n = n + 1 }

END { print "population of", n,

"Asian countries in million is", pop }

Относительно файла countries эта программа выдает результат:

population of 3 Asian countries in

million is 1765

Действие, связанное с шаблоном $4 == "Asia" выполняет 2 назначения, одно - накопление населения и другое - подсчет стран.

Назначения в предыдущей программе могут быть записаны более сжато с использованием операторов "+=" и "++":

$4 == "Asia" {pop += $3; ++n}

Оператор "+=" заимствован из языка программирования Си, следовательно:

pop += $3

аналогично:

pop = pop + $3

но оператор "+=" короче и работает быстрее.

Операторами назначения являются:

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

Операторами приращения являются "++" и "--". Как и в языке Си они могут использоваться как префиксные (++x) или постфиксные (x++) операторы. Если x равно 1, то "i = ++x" увеличивает x, затем устанавливает i равным 2, в то время как "i = x++" устанавливает i равным 1, затем увеличивает x. Аналогичная интерпретация для префиксного и постфиксного операторов "--".

Операторы присвоения, увеличения и уменьшения могут использоваться в арифметических выражениях.

Мы используем установки по умолчанию в следующих программах, которые находят страны с наибольшим населением:

maxpop < $3 { maxpop = $3; country = $1 }

END { print country, maxpop }

Обратите внимание, что эта программа будет некорректна, если значение $3 будет отрицательным.

В табл. 24 перечислены встроенные арифметические функции.

Таблица 24 Встроенные арифметические функции

Функция

Возвращаемое значение

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()

Функция rand() возвращает псевдослучайное число с плавающей точкой в диапазоне от 0 до 1, а srand(x) может быть использовано для установки нового начального значения генерирующей программы. Если srand() не имеет аргументов, то начальное значение производится из времени дня.

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