Компьютерные сети и технологии
Привет
Пользователь:

Пароль:



[ ]
[ ]

В сети
Гостей: 16
Участников: 0
На странице: 1
Участников: 3946, Новичок: Lelandabisp

Разное


(Занятие 10) awk - язык сканирования и обработки текста
Операционная система UNIX (руководство пользователя)
на Friday 04 August 2006
от список авторов отправить по email статья печатать статья
в Сетевые Операционные Системы ОС > Linux - Unix



10.17. Массивы

awk поддерживает одномерные массивы. Массивы и элементы массивов нет необходимости объявлять. Индексы массива могут быть числом или строкой. Пример условного обозначения числового индекса:

    x[NR] = $0

присваивает текущую строку вводного файла элементу NR массива x.

Фактически возможно считать целый вводной файл в массив с помощью программы awk:

              
        END   

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

Элементы массива могут именоваться с помощью нецифровых величин. Например, следующая программа накапливает общее количество населения Asia и Africa в соответветствующий массив pop. Оператор END печатает общее количество населения этих двух континентов.

        /Asia/          
        /Africa/        
 END 

Результат получим следующий:

      Asian population in million is   1765
      African population in million is   37

В этой программе, если вы воспользуетесь pop[Asia] вместо pop["Asia"], то выражение будет использовать значение переменной как индекса, и так как значение переменной не установлено, то количество населения будет накапливаться в pop[""].

Предположим, нужно определить общую площадь каждого континента из файла countries.

Каждое выражение может быть использовано как индекс при ссылке в массиве. Так:

    area[ $4 ] += $2

использует строку в 4-м поле текущей записи вводного файла для индексирования массива area, накапливая значение второго поля:

        BEGIN  
               
        END    

Относительно файла countries получим результат:

          Asia  13611
          North America 7467
          South America 4358
          Australia 2968
          Africa 1888

Эта программа использует следующую форму оператора, который организует итерации для нахождения индекса в массиве:

    for ( i in array ) оператор

выполняется "оператор" с переменной i , для которой определен array(i). Цикл выполняется для каждого определенного индекса, который выбирается в произвольном порядке.

awk не поддерживает многомерные массивы, но допускает список индексов. Они объединяются в один индекс значениями, разделенными строкой (хранимой в переменной SUBSEP).

Например:

for ( i = 1; i <= 10; i++ )
for ( j = 1; j <= 10; j++ )
arr[i]
 = ...

создает массив, который ведет себя как двумерный массив. Индексом является сочетание i, SUBSEP и j.

Вы можете определить, появляется ли конкретное i в массиве arr:

    if ( "Africa" in arrea ) ...

Это условие приведет к выполнению тестирования без создания массива ["Africa"]. Этот массив создался, бы если использовалось

    if ( area ["Africa"] != "" ) ...

Возможно также разбить любую строку на поля, которые станут элементами массива. Это можно сделать с помощью встроенной функции split:

    split ( "s1:s2:s3", a, ":" )

split разбивает строку на 3 поля, используя в качестве разделителя ":" и сохраняя s1 в [1], s2 - в [2], s3 - в [3]. Возвращаемое значение этого оператора равно числу полей, т.е. трем. Третий аргумент функции split - это регулярное выражение, будет использоваться как поле разделителя. Если третий аргумент отсутствует, то в качестве поля разделителя будет использоваться FS.

Массив элементов может быть разделен с помощью аргумента delete:

    delete имя_массива [индекс]


10.18. Функции, определенные пользователем

awk поддерживает функции, определенные пользователем:

         function имя( список_аргументов) {
                      операторы
         }

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

Массив элементов просматривается при обращении, как и в Си. Функция при просмотре не может изменить значение скалярных аргументов. Внутри функции формальные параметры являются локальными переменными, но все другие переменные являются глобальными. У вас может быть любое количество формальных параметров, которые используются только как локальные переменные. Операторreturnявляется необязательным, но если он отсутствует, возвращаемое значение будет неопределенным.

10.19. Комментарии

В программе awk могут присутствовать комментарии. Они начинаются с символа # и заканчиваются символом новой строки:

    print x,y # это комментарий 

Операторы обычно занимают одну строку. Несколько операторов могут располагаться на одной строке, тогда они должны разделяться точкой с запятой. Длинный оператор может располагаться на нескольких строках, причем каждая продолжаемая строка должна заканчиваться символом "\". Нельзя продолжить строку вида "....". Такое продолжение встречается редко, однако как только строка заканчивается запятой, операторы продолжаются автоматически. Примером этого служат операторы print и printf, и такое возможно после операторов "&&" и "||". Несколько операторов "шаблон-действие" могут появляться на одной строке, если они разделены точкой с запятой.



Поиск Компьютерные сети и технологии

Copyright © 2006 - 2020
При использовании материалов сайта ссылка на xnets.ru обязательна!