ru af en-us pl be tr

Категория Unix  

Примеры использования


2012-07-19 22:09:37

Примеры использования


awk может использоваться непредсказуемым способом: системы баз данных, различные компиляторы и трасляторы, в дополнение к традиционным задачам поиска информации, обработки данных и генерации отчетов. Программы awk значительно короче, чем аналогичные программы, написанные на традиционных языках программирования, таких как Pascal и Си. В этом подразделе приведены примеры, иллюстрирующие некоторые дополнительные возможности программ awk.

 Генерирование отчетов

awk особенно успешно применяется для выдачи отчетов, которые суммируют и форматируют информацию. Предположим, вы хотите создать отчет из файла countries, в котором континенты перечисляются в алфавитном порядке и по каждому континету страны перечисляются в убывающем по населению порядку:

        Africa:rn                Sudan            19rn                Algeria          18rn        Asia:rn                China           866rn                India           637rn                USSR            262rn        Australia:rn                Australia        14rn        North America:rn                USA             219rn                Canada           24rn        South America:rn                Brazil          116rn                Argentina        26

Так как здесь несколько задач обработки данных, то намного легче выполнить этот отчет в несколько стадий. Первая: создать список троек "континент_страна_население", в котором каждое поле отделяется запятой. Это можно сделать с помощью следующей программы triplies, которая использует массив pop, индексированный в форме "континент:страна" для сохранения количества населения данной страны. Оператор print в секции END этой программы создает список троек "континент-страна-население", который направляется в программу sort:

        BEGIN  { FS = "t" }rn               { pop[$4 ":" $1] += $3 }rn        END    { for ( cc in pop )rn           print cc "":" pop[cc] | "sort -t: +0 -1 +2nr"  }

Аргумент для sort заслуживает специального внимания. Аргумент -t: говорит sort, чтобы использовать ":" как разделитель полей. Аргументы +0 и -1 делают первое поле первичным ключом sort. В общем случае +i -j делают поля i+1, i+2, ... j ключом сортировки. Если j опущено, поля от i+1 до конца записи используются. Аргумент +2nr делает третье поле (цифровое уменьшение) вторичным ключом sort ( n - числовое, r - обратный порядок). Относительно файла countries эта программа выдает результат:

        Africa:Sudan:19rn        Africa:Algeria:18rn        Asia:China:866rn        Asia:India:637rn        Asia:USSR:262rn        Australia:Australia:14rn        North America:USA:219rn        North America:Canada:24rn        South America:Brazil:116rn        South America:Argentina:26

Порядок вывода правильный, но неверен формат. Чтобы преобразовать формат вывода в требуемую форму, запустите программу format с этими данными:

        BEGIN  {  FS = ":" }rn        {      if ($1 != prev) {rn                   print "n" $1 ":"rn                   prev = $1rn                }rn                printf "t%-10s %6dn", $2, $3rn        }

Эта программа прерывания управления печатает только первое появление имени континента и форматирует строки "страна-население", соответствующие этому континенту, требуемым способом. Командная строка:

	awk -f triplies countries | awk -f format 
дает требуемый отчет. В этом примере предполагается, что сложные задачи преобразования данных и их форматирования могут быть сокращены до нескольких простых команд awk и сортировки.

Дополнительные примеры

 Частота использования слов

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

        { for ( w = 1; w <= NF; w++ ) count[$w]++ }rn  END   {for( w in count) print count[w], w | " sort -nr" }

Первый оператор использует массив count для накопления количества появлений каждого слова. Как только ввод будет считан, второй оператор цикла for направляет окончательный счетчик каждого слова команде sort.

Накопление

Предположим вы имеете два файла deposite и withdrawals, записи которых содержат имя поля и количество полей. Для каждого имени вы хотите напечатать итог net, определяющийся вычитанием общего вывода из общего депозита. Баланс net может быть вычислен следующей программой:

        awk 'rn        FILENAME == "deposits"        { balance[$1] += $2 }rn        FILENAME == "withdrawals"     { balance[$1] -= $2 }rn        END                        { for (name in balance )rn                                  print name, balance[name]rn        }' deposits withdrawals 

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

Случайный выбор

Следующая функция печатает случайные элементы k, начиная с первого элемента массива A, состоящего из n элементов. В программе k - это количество входов, необходимых для печати, n - количество элементов, которые еще будут исследоваться. Выбор печатать или нет i-тый элемент определяется тестом rand() < k/n:

        function choose (A, k, n, i) {rn                for (i = 1; n > 0; i++)rn                     if (rand() < k/n--) {rn                        print Arn                        k--rn                      }rn                 }rn        }

Возможности shell

Следующая программа awk приблизительно моделирует возможности shell системы UNIX. Строка, содержащая только знак "=" заново выполняет последнюю выполненную команду. Строка, начинающаяся с =cmd заново выполняет последнюю команду, вызов которой включает строку cmd. Иначе выполняется текущая строка.

         $1 == "=" { if [NR == 1]rn                      system ( x[NR] = x [NR-1] )rn                    elsern                      for ( i= NR-1]; i > 0; i-- )rn                           if ( x ~ $2 ) {rn                                system(x[NR] = x)rn                                breakrn                            }rn                     next }rn        /./          { system(x[NR] = $0) }




Похожие статьи

 Простые команды
 Часто используемые ключи команды ls
 Сообщения редактора
 Электронная связь
 


Сайт является частным собранием материалов и представляет собой любительский информационно-образовательный ресурс. Вся информация получена из открытых источников. Администрация не претендует на авторство использованных материалов. Все права принадлежат их правообладателям