Встроенные переменные: сведения о данных и об окружении
⇐ ПредыдущаяСтр 5 из 5 Помимо встроенных переменных, о которых мы уже говорили, существуют и другие, которые предоставляют сведения о данных и об окружении, в котором работает awk: · ARGC — количество аргументов командной строки; · ARGV — массив с аргументами командной строки; · ARGIND — индекс текущего обрабатываемого файла в массиве ARGV; · ENVIRON — ассоциативный массив с переменными окружения и их значениями; · ERRNO — код системной ошибки, которая может возникнуть при чтении или закрытии входных файлов; · FILENAME — имя входного файла с данными; · FNR — номер текущей записи в файле данных; · IGNORECASE — если эта переменная установлена в ненулевое значение, при обработке игнорируется регистр символов; · NF — общее число полей данных в текущей записи; · NR — общее число обработанных записей. Переменные ARGC и ARGV позволяют работать с аргументами командной строки. При этом скрипт, переданный awk, не попадает в массив аргументов ARGV. Напишем такой скрипт: awk 'BEGIN{printARGC,ARGV[1]}' myfile После его запуска можно узнать, что общее число аргументов командной строки — 2, а под индексом 1 в массиве ARGV записано имя обрабатываемого файла. В элементе массива с индексом 0 в данном случае будет «awk». Работа с параметрами командной строки Переменная ENVIRON представляет собой ассоциативный массив с переменными среды. Опробуемеё: awk ' BEGIN{ print ENVIRON["HOME"] print ENVIRON["PATH"] }' Работа с переменными среды Переменные среды можно использовать и без обращения к ENVIRON. Сделать это, например, можно так: echo | awk -v home=$HOME '{print "My home is " home}' Работа с переменными среды без использования ENVIRON Переменная NF позволяет обращаться к последнему полю данных в записи, не зная его точной позиции:
awk 'BEGIN{FS=":"; OFS=":"} {print $1,$NF}' /etc/passwd Пример использования переменной NF Эта переменная содержит числовой индекс последнего поля данных в записи. Обратиться к данному полю можно, поместив перед NF знак $. Переменные FNR и NR, хотя и могут показаться похожими, на самом деле различаются. Так, переменная FNR хранит число записей, обработанных в текущем файле. Переменная NR хранит общее число обработанных записей. Рассмотрим пару примеров, передав awk один и тот же файл дважды: awk 'BEGIN{FS=","}{print $1,"FNR="FNR}' myfile myfile Исследование переменной FNR Передача одного и того же файла дважды равносильна передаче двух разных файлов. Обратите внимание на то, что FNR сбрасывается в начале обработки каждого файла. Взглянем теперь на то, как ведёт себя в подобной ситуации переменная NR: awk ' BEGIN {FS=","} {print $1,"FNR="FNR,"NR="NR} END{print "There were",NR,"records processed"}' myfile myfile Различие переменных NR и FNR Как видно, FNR, как и в предыдущем примере, сбрасывается в начале обработки каждого файла, а вот NR, при переходе к следующему файлу, сохраняет значение. Пользовательские переменные Как и любые другие языки программирования, awk позволяет программисту объявлять переменные. Имена переменных могут включать в себя буквы, цифры, символы подчёркивания. Однако, они не могут начинаться с цифры. Объявить переменную, присвоить ей значение и воспользоваться ей в коде можно так: awk ' BEGIN{ test="This is a test" print test }' Работа с пользовательской переменной Условный оператор Awk поддерживает стандартный во многих языках программирования формат условного оператора if-then-else. Однострочный вариант оператора представляет собой ключевое слово if, за которым, в скобках, записывают проверяемое выражение, а затем — команду, которую нужно выполнить, если выражение истинно. Например, есть такой файл с именем testfile: 10 15 6 33 45 Напишем скрипт, который выводит числа из этого файла, большие 20:
awk '{if ($1 > 20) print $1}' testfile Однострочный оператор if Если нужно выполнить в блоке if несколько операторов, их нужно заключить в фигурные скобки: awk '{ if ($1 > 20) { x = $1 * 2 print x } }' testfile Выполнение нескольких команд в блоке if Как уже было сказано, условный оператор awk может содержать блок else: awk '{ if ($1 > 20) { x = $1 * 2 print x } else { x = $1 / 2 print x }}' testfile Условный оператор с блоком else Ветвь else может быть частью однострочной записи условного оператора, включая в себя лишь одну строку с командой. В подобном случае после ветви if, сразу перед else, надо поставить точку с запятой: awk '{if ($1 > 20) print $1 * 2; else print $1 / 2}' testfile Условный оператор, содержащий ветви if и else, записанный в одну строку Цикл while Цикл while позволяет перебирать наборы данных, проверяя условие, которое остановит цикл. Вот файл myfile, обработку которого мы хотим организовать с помощью цикла: 124 127 130 112 142 135 175 158 245 Напишем такой скрипт: awk '{ total = 0 i = 1 while (i < 4) { total += $i i++ } avg = total / 3 print "Average:",avg }' testfile Обработка данных в цикле while Цикл while перебирает поля каждой записи, накапливая их сумму в переменной total и увеличивая в каждой итерации на 1 переменную-счётчик i. Когда i достигнет 4, условие на входе в цикл окажется ложным и цикл завершится, после чего будут выполнены остальные команды — подсчёт среднего значения для числовых полей текущей записи и вывод найденного значения. В циклах while можно использовать команды break и continue. Первая позволяет досрочно завершить цикл и приступить к выполнению команд, расположенных после него. Вторая позволяет, не завершая до конца текущую итерацию, перейти к следующей. Вот как работает команда break: awk '{ total = 0 i = 1 while (i < 4) { total += $i if (i == 2) break i++ } avg = total / 2 print "The average of the first two elements is:",avg }' testfile Команда break в цикле while Цикл for Циклы for используются во множестве языков программировании. Поддерживает их и awk. Решим задачу расчёта среднего значения числовых полей с использованием такого цикла: awk '{ total = 0 for (i = 1; i < 4; i++) { total += $i } avg = total / 3 print "Average:",avg }' testfile Цикл for Начальное значение переменной-счётчика и правило её изменения в каждой итерации, а также условие прекращения цикла, задаются в начале цикла, в круглых скобках. В итоге нам не нужно, в отличие от случая с циклом while, самостоятельно инкрементировать счётчик.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|