Операционная система UNIX. Руководство программиста

     

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


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

Smith draw 3 Brown eqn 1 Jones nroff 4 Smith nroff 1 Jones spell 5 Brown spell 9 Smith draw 6

Например, первая строка означает, что Смит использует программу draw три раза. Если надо определить общее число использований каждой программы и упорядочить выходную информацию по алфавиту, можно воспользоваться следующим awk-текстом (допустим, он помещен в файл с именем list1):

{ use [$1 " " $2] += $3 } END { for (np in use) print np "\t" use [np] | "sort +0 +2nr" }

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

Brown eqn 1 Brown spell 9 Jones nroff 4 Jones spell 5 Smith draw 9 Smith nroff 1

Если желательно отформатировать этот результат таким образом, чтобы каждое имя печаталось только один раз, можно организовать конвейер из предыдущей awk-программы и следующей программы (которая помещена в файл с именем format1):

{ if ($1 != prev) { print $1 ":" prev = $1 } print "\t" $2 "\t" $3 }

Переменная prev используется для того, чтобы убедиться, что каждое уникальное значение $1 печатается ровно один раз. Команда

awk -f list1 prog.usage | awk -f format1

выдаст такой результат:

Brown: eqn 1 spell 9 Jones: nroff 4 spell 5 Smith: draw 9 nroff 1

Часто оказывается удобным объединить несколько разных awk-программ с другими командами shell'а, такими как sort(1), что и было сделано в программе list1.



Содержание раздела