Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

10.7. Шаблоны

В выражении шаблон-действие, шаблон служит для выбора записей, для которых выполняется соответствующее действие.

10.7.1. Шаблоны BEGIN и END

BEGIN используется для получения управления перед считыванием первой вводной строки, так что любое действие для шаблона BEGIN выполняется один раз до того, как команда awk начинает считывать первую запись. END используется для получения управления после считывания последней вводной строки.

Следующая awk-программа использует BEGIN для установки в качестве разделителя символа табуляции (\t) и создания заголовков в выводном файле. Поле-разделитель хранится во встроенной переменной FS. Хотя FS может быть восстановлено в любом месте, благоразумнее поместить в секции BEGIN, до того как вводной файл начнет считываться. Второй printf в программе выполняется для каждой вводной строки и формирует выводной файл в виде таблицы, где вся информация располагается по колонкам с заголовками. END печатает результат. (Обратите внимание, что длинная строка может быть продолжена на другой строке после запятой).

       BEGIN { FS = "\t"
                printf "%10s %6s %5s   %s\n",
                "COUNTRY", "AREA", "POP", "CONTINENT" }
                printf "%10s %6s %5s   %s\n", $1, $2, $3, $4
                area = area + $2; pop = pop + $3}
       END {printf "\n%10s %6d  %5d\n", "TOTAL", area, pop }

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

          COUNTRY   AREA     POP     CONTINENT
             USSR   8650     262     Asia
           Canada   3852      24     North America
            China   3692     866     Asia
              USA   3615     219     North America
           Brazil   3286     116     South America
        Australia   2968      14     Australia
            India   1269     637     Asia
        Argentina   1072      26     South America
            Sudan    968      19     Africa
          Algeria    920      18     Africa

            TOTAL  30292    2201