Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KTNI_Kozlov_otvety / 14_GAWK.doc
Скачиваний:
30
Добавлен:
05.06.2015
Размер:
132.61 Кб
Скачать

Цикл for

Цикл for используется для тех же целей, что и цикл while, но имеет другой синтаксис. За ключевым словом for здесь следуют три выражения, которые заключены в круглые скобки и разделены точкой с запятой.

tor{выражение 1; выражение2; выражениеЗ)

действия }

Первое выражение выполняется перед началом цикла. В нем обычно инициализи­руется переменная, используемая для управления циклом. Второе выражение является тестируемым выражением (проверяемым условием) и непосредственно управляет вы­полнением цикла. Третье выражение обычно выполняется на каждой итерации цикла и после его завершения. Как правило, в этом выражении изменяется значение пере­менной цикла. Далее указываются действия gawk, производимые на каждой итерации цикла, В качестве действия может применяться и блок действий, заключенных в фи­гурные скобки. Третье выражение — это, чаще всего, операция увеличения переменной цикла на единицу, которая производится после выполнения действия.

for{инициализация; тестируемое выражение; приращение) {

действие }

В следующем примере цикл for используется для вывода на печать первых трех полей файла field3for. Обратите внимание, насколько цикл for компактнее цикла while.

Цикл for-in

В предыдущих примерах в качестве индексов массива используются числовые пе­ременные. Однако применять их в качестве индексов ассоциативного массива нельзя. Ссылки на элементы ассоциативного массива задаются с помощью строковых пере­менных. Для обработки элементов ассоциативного массива язык gawk имеет специаль­ную циклическую управляющую конструкцию. Она также начинается с ключевого слова for; однако во всем остальном ее синтаксис отличается от синтаксиса обычного цикла for. В цикле for-in за ключевым словом for следует переменная, потом — ключевое слово in и имя массива. В ходе выполнения цикла переменной присваивается строковое значение, являющееся индексом массива. Использование в качестве индекса массива каких-либо переменных других типов здесь не допускается. Поэтому цикл for-in, предназначенный для обработки ассоциативных массивов, имеет ограниченное приме­нение. Синтаксис этого цикла приведен ниже:

for(переменная in имя-массива) {

действие }

В сценарии bkcount.gawk на печать последовательно выводятся обработанные эле­менты массива bookcnt. При обработке записей в качестве индекса массива bookcnt выступает четвертое поле записи, представляющее собой название издательства. На каждой итерации цикла for строковой переменной pubname последовательно присваиваются значения, являющиеся индексами массива bookcnt. На печать выводится не только эле­мент массива, но и текущий индекс.

bkcount.gawk

{ bookcnt[54] = bookcnt[$4J + 1 }

END {

for(pubname in bookcnt) { print bookcnt[pubname], pubname;

} }

$gawk -f bkcount.gawk books

2 Penguin 1 Academic 1 Random

Управляющая структура if

Управляющая структура if языка gawk позволяет выполнить проверку условий. Син­таксис структуры if таков:

if(условие)

{ действие

}

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

Структура if может содержать ключевое слово else, после которого указывается действие, подлежащее выполнению лишь в том случае, если проверяемое условие струк­туры if является ложным. В этом смысле структура if-else напоминает ветвящееся дерево: если условие истинно, выполняется переход на одну ветвь дерева, если ложно — на другую.

Теперь возвратимся к синтаксису структуры if-else. Обратите внимание на то, что после определения действия, заданного перед ключевым словом else, отсутствует точка с запятой. Этим структура if-else напоминает аналогичную структуру языка программирования С. Однако если в программе, написанной на С, вы нечаянно введете точку с запятой, появится сообщение об ошибке. В gawk точка с запятой является разделителем нескольких действий. В рассматриваемом примере сценария markup.gawk третье поле файла books содержит значение цены. Если цена превышает 10.00, она увеличивается на 10%; в противном случае цена увеличивается на 20%. Обратите вни­мание на отсутствие точки с запятой после определения действия, перед ключевым словом else.

markup.gawk

{

if($3 > 10.00)

$3 - $3 + (0.10 * $3 ) else

$3 = $3 + (0.20 + $3);

print SO }

Создание пользовательских фильтров с помощью gawk

С помощью gawk программист может создавать собственные фильтры, помещая всю инструкцию в сценарий shell. Этот файл затем можно сделать исполняемым, и его имя станет новой командой Linux. В сценарии инструкции gawk следует брать в кавычки. В файле сценария инструкцию нужно записывать так, как будто вы собираетесь вы­полнять ее из командной строки. Шаблон и действие можно записать в отдельных строках. Это значит, что первая строка gawk-операции будет начинаться с ключевого слова gawk, за которым будет следовать одинарная кавычка. Затем в отдельных строках можно указать шаблон и действие. После закрывающей одинарной кавычки в той же строке нужно указать имена файлов.

gawk ' образец {

действие; ) ' имена_файлов

В следующем примере пользователь поместил всю инструкцию gawk в файл сце­нария field3. Эта инструкция отображает первые три поля каждой строки и, что особенно важно, взята в кавычки. После установления для файла сценария права на выполнение (посредством команды chmod) данный файл можно выполнять как команду.

fiel(13

gawk ' (

for(1-1; (i<=3); i++;) {

printf("%s\t", $i); }

printf("\n") ; }' books

$ chmod 755 field3 $ field3

Tempest Shakespeare 15.75

Christmas Dickens 3.50

Iliad Homer 10.25

Raven Рое 2.50

Пример выполнения работы

Задание. Перед обработкой строк вывести заголовок «Book List», а после обработки — значение переменной NR. Поскольку значение NR увеличивается по мере обработки каждой строки на единицу, то после завершения процесса оно станет равным общему количеству записей в файле.

Конструкция GAWK.

$ gawk 'BEGIN {print "Book List") {print} END{print "Total records is ",

NR}' books

Book List

Tempest Shakespeare 15.75 Penguin

Christmas Dickens 3.50 Academic

Iliad Homer 10.25 Random

Raven Рое 2.50 Penguin

Total records is 4

Соседние файлы в папке KTNI_Kozlov_otvety