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

Использование шаблона в качестве условия

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

В языках программирования условные управляющие конструкции могут быть дос­таточно сложными, включать по нескольку логических операторов и операторов срав­нения, а также арифметические выражения и даже вызовы функций. Подобно языкам программирования, шаблоны gawk также могут быть достаточно сложными и содержать подшаблоны, использующие логические и арифметические операторы, а также опера­торы сравнения. В этом смысле шаблон можно рассматривать как синоним термина «выражение». Однако тогда как используемые в языках программирования операнды представляют собой числа или строки, в шаблоне gawk операнды рассматриваются как образцы, с которыми производится сравнение. В gawk в ходе выполнения операции сравнения с шаблоном рассматривается некоторое значения. Логические операции вклю­чают подвыражения, которые и выполняют сравнение с шаблоном. Фактически на под­выражения ссылаются как на «шаблоны», а сложные логические операции будут име­новаться «составными шаблонами».

Равенство и операторы сравнения

Простые тестируемые выражения можно сформировать с помощью оператором про­верки на равенство значений, переменных полей и констант. Операторы проверки на равенство аналогичны подобным операторам языка программирования С. В gawk такой оператор обозначается двумя знаками равенства (==). Этим он отличается от подобного оператора в других языках программирования. Одиночный знак равенства обозначает оператор присваивания =. Поэтому нужно быть внимательным, используя эти опера­торы. Оператор проверки на неравенство обозначается восклицательным знаком, за которым следует знак равенства, !=. Применение указанных операторов демонстрирует следующий пример. Здесь на печать выводятся только те строки, в последних полях которых находится строка «Penguin». Обратите внимание, что в данном случае исполь­зуется не шаблон, выделяемый косыми, а строковая константа. Шаблон, выделяемый двумя косыми, представляет собой шаблон поиска, тогда как строка является обычным значением.

$ gawk '$4 == "Penguin" {print}' books

Tempest Shakespeare 15.75 Penguin Raven Рое 2.50 Penguin

Для формирования логических выражений, выполняющих проверку условий, можно применять также операторы сравнения. Утилита gawk использует те же операторы срав­нения, что и другие языки программирования: >, <, >= и <= (все они описаны в табл. 3). Однако в отличие от языка С, операторы сравнения gawk позволяют со­поставлять строковые значения. Сравнение производится в соответствии с алфавитом, поэтому строка «Aleina» будет «меньше» строки «Larisa». В следующем примере поль­зователь просматривает все книги, цена которых не превышает 10.00. Обратите вни­мание, что в качестве одного из операндов применяется числовая константа.

$ gawk '$3 > 10.00 {print}' books

Tempest Shakespeare 15.75 Penguin Iliad Homer 10.25 Random

Логические операции

В gawk существует множество логических операторов, которые могут применяться для проверки некоторых условий. Эти операторы аналогичны стандартным логическим операторам языка программирования С. Логический оператор AND обозначается двой­ным амперсандом &&, оператор OR — двумя вертикальными линиями ||, а оператор NOT — восклицательным знаком !. При работе с логическими операторами обычно применяются скобки. В следующем примере выполняется проверка значения четвертого поля записи, содержащей шаблон «Penguin», и значения третьего поля с числом 10.00. В результате выполнения операции сравнения формируется список книг стоимостью более 10.00, выпущенных издательством Penguin, который выводится на печать.

$ gawk '($4 == "Penguin") && ($3 > 10.00) {Print)' books

Tempest Shakespeare 15.75 Penguin

В следующем примере пользователь формирует список книг, выпущенных издатель­ствами Penguin и Academic. При создании списка строки «Penguin» и «Academic» срав­ниваются со значениями из четвертого поля текущей записи.

$ gawk '($4 = "Penguin") || ($4 == "Academic") {print}' books

Tempest Shakespeare 15.75 Penguin

Christmas Dickens 3.50 Academic

Raven Рое 2.50 Penguin

Поиск по шаблону

Специальные символы ~ и !~ применяются для выполнения поиска по шаблону в полях текущей записи. Вместо того чтобы посредством операции = сравнивать все поля с шаблоном, можно с помощью операции ~ проверить, присутствует ли конкретный шаблон в поле. При таком поиске в полях правый операнд — это шаблон, а левый — поле, в котором его нужно найти. В следующем примере в первом поле выполняется поиск шаблона «mas»:

$ gawk '($1 - /mas/) (print)' books

Christmas Dickens 3.50 Academic

А ниже представлен пример, где производится выборка всех записей, в первом поле которых шаблон «mas» отсутствует.

$ gawk r($l !- /mas/) {print}' books

Tempest Shakespeare 15.75 Penguin

Iliad Homer 10.25 Random Raven Рое 2.50 Penguin

Специальные символы можно использовать не только при общем поиске по шаб­лону, но и в случае поиска в полях. В приведенном ниже примере пользователь ищет в четвертом поле шаблон «Penguin», начинающийся со строчной или с прописной буквы. Специальный символ [] служит для определения последовательности символов, начи­нающейся с прописной и строчной букв Р.

$ gawk '($4 - /[Pp]enguin/) {print}' books

Tempest Shakespeare 15.75 Penguin Raven Рое 2.50 Penguin

Шаблоны BEGIN и END

В инструкции gawk можно использовать два специальных шаблона, что дает воз­можность пользователю указывать действия, которые должны выполняться до и после обработки строк. Ключевое слово BEGIN задает действия, подлежащие выполнению перед операцией обработки, a END — действия, подлежащие выполнению после таковой. В нашем следующем примере перед обработкой строк выводится заголовок «Book List», а после обработки — значение переменной NR. Поскольку значение NR увеличивается по мере обработки каждой строки на единицу, то после завершения процесса оно станет равным общему количеству записей в файле.

$ 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

Файлы инструкций gawk

Инструкции по мере их усложнения лучше помещать в файл, который может читать gawk. Если вам когда-нибудь придется вносить в них изменения, то достаточно будет откорректировать этот файл. Читать инструкции из файла, а не из командной строки, gawk позволяет опция -f. В следующем примере инструкции для выдачи списка книг издательства Penguin помещаются в файл findbk. gawk, после чего вызывается инструкция gawk с опцией -f и именем файла findbk. gawk.

Управляющие конструкции

Синтаксис языка gawk напоминает синтаксис обычного языка программирования. С его помощью можно определять переменные, конструировать выражения и присваи­вать значения. Язык этой утилиты включает несколько управляющих структур, обес­печивающих повторное выполнение команд и выбор нужной команды или последова­тельности команд. Повторное выполнение команд (циклы) организуется с помощью структур while, for и for-in. Управляющая структура для выбора варианта одна, if. Все эти структуры, за исключением цикла for-in, очень похожи на соответствующие структуры языка про­граммирования С.

Цикл while

Цикл while начинается с ключевого слова while, за которым следует заключенное в скобки проверяемое условие. После проверяемого условия указываются действия, которые могут группироваться в блоки, заключенные в фигурные скобки. Каждое дей­ствие внутри блока выделяется точкой с запятой. Вот синтаксис цикла while:

while (условие) ( действия-gawk;

}

Каждая итерация цикла, как правило, выполняется в три этапа: инициализация цикла, проверка условия и приращение значения переменной цикла, которая исполь­зуется для управления таковым. В приведенном ниже файле threefields.gawk на печать выводятся три первых поля каждой записи. Для управления циклом используется пе­ременная i. На каждой итерации цикла значение этой переменной увеличивается на 1. Эта операция выполняется в блоке, заключенном в фигурные скобки. Затем значение переменной сравнивается с числом 3 и таким образом определяется момент завершения цикла. Значение переменной i используется в качестве ссылки на отдельное поле записи.

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