10.20. Вывод

Операторы print и printf являются простейшими конструкциями, которые генерируют вывод. Оператор print используется для образования просто вывода; printf - для форматируемого вывода. Подобно shell awk позволяет вам перенаправлять вывод в файл или в канал.

10.20.1. Оператор print

Оператор:

	print expr1, rxpr2, ..., exprn 

печатает строки каждого выражения, разделенные при помощи разделителей полей и следующими за ними разделителями записей.

Оператор:

	print 

является сокращенной формой оператора:

	print $0

Чтобы напечатать пустую строку, введите:

	print ""

10.20.2. Разделители вывода

Разделители полей выводного файла и разделители записей хранятся в строковых переменных OFS и ORS. Первоначально значение OFS устанавливается как один пробел и ORS - один символ новой строки, но эти значения могут быть изменены в любой момент времени. Например, следующая программа печатает первое и второе поле каждой записи, имеющее двоеточие между полями и два символа новой строки после второго поля.

        BEGIN   { OFS = ":"; ORS = "\n\n" }
                { print $1, $2 }

Обратите внимание, что :

	{ print $1 $2 }

печатает первое и второе поле без разделителя полей вводного файла.

10.20.3. Оператор printf

Оператор printf, используемый в awk, подобен этому оператору в Си, за исключением того, что спецификатор * не поддерживается.

Общий формат оператора:

	print format expr1, rxpr2, ..., exprn 

где format - это строка, содержащая информацию, которая будет печататься, и какое преобразование будет выполняться над выражением.

Каждая спецификация начинается с символа "%", заканчивается буквой, которая определяет преобразование, и может включать:
- - выравнивание по левому краю в поле;
width - заполнить поле на заданную ширину; поля, начинающиеся с лидирующего нуля, должны быть заполнены нулями;
.prec - указывает максимальную ширину строки или разряд справа от десятичной точки.

В табл. 26 приведен список символов преобразования printf.

Таблица 26
Символы преобразования printf

Символ Вид печати выражения
c Один символ
d Десятичное число
e [-]d.ddddddE[+-]dd
f [-]ddd.dddddd
g e или f преобразование с подавленем незначащих нулей
o Беззнаковое восьмиричное число
s Строка
x Беззнаковое шестнадцатиричное число
% Печать %; нет аргументов для преобразования

Примеры оператора printf с соответтвующим выводом на той же строке.

        printf "%d", 99/2                     49
        printf "%s", 99/2                     4.950000e+01
        printf "%f", 99/2                     49.500000
        printf "%6.2f", 99/2                   49.50
        printf "%g", 99/2                      49.5
        printf "%o", 99                        143
        printf "%06o", 99                      000143
        printf "%x", 99                        63
        printf "|%10s|", "January"             |   January|
        printf "|%-10s|", "January"            |January   |
        printf "|%.3s|", "January"             |Jan|
        printf "|%10.3s|", "January"           |       Jan|
        printf "|%-10.3s|", "January"          |Jan       |
        printf "%%"                            %

По умолчанию формат чисел выводного файла %.6g. Он может быть изменен, если вы зададите новое значение OFMT. OFMT также управляет преобразованием цифровых значений в строковые при конкатенации и создании массива индексов.

10.20.4. Вывод в файлы

В качестве стандартного вывода для печати можно использовать файлы. Для этого используются операторы изменения направления > и >>. Например, следующая программа вызывает печать из файла countries всех строк, в которых 3-е поле (население) больше, чем 100, в файл bigpop и все остальные строки в файл smallpop:

        $3 > 100     { printf $1, $3 > "bigpop"  }
        $3 > 100     { printf $1, $3 > "smallpop"  }

Обратите внимание, что имена файлов заключены в двойные кавычки; без кавычек bigpop и smallpop будут просто неустановленными переменными. Если имена выводных файлов создаются с помощью выражения, они должны быть заключены в круглые скобки:

	$4 ~ /North America/ { print $1 > ("tmp" FILENAME) }

так как оператор > имеет более высокий приоритет, чем конкатенация. Без круглых скобок конкатенация tmp и FILENAME не будет производиться.

Примечание. Файлы в программе awk открываются один раз. Если файл открыт с помощью >>, его содержимое сохраняется и вывод дополняется в файл.

10.20.5. Вывод в канал

Вы можете направить печать в канал.

Оператор:

	print | "командная_строка"

направляет вывод в "командную_строку". Хотя канал здесь показан как строковая переменная, заключенная в двойные кавычки, командная строка и имена файлов могут приходить из переменных и возвращать значения из функций.

Предположим, вы хотите создать список страна-население так, чтобы страны были отсортированы по алфавиту. Программа awk накапливает значение "количество населения" из 3-го поля для каждого названия страны из 4-го поля и вывод направляет в массив pop. Затем print название каждой страны и ее население направляет вывод команде sort:

        BEGIN    { FS     "\t"  }
                 { pop [$4] += $3 }
        END      { for ( c in pop )
                   print c ":" pop[c] | "sort" }

В результате работы этой программы получим:

          Africa:37
          Asia:1765
          Australia:14
          North America:243
          South America:142

Во всех этих операторах print, вызывающих перенаправление вывода, файлы или каналы идентифицируются с помощью имен (так, канал в данном примере называется "sort"), но они создаются и открываются один раз при запуске. Так что в последнем примере для всех "c" в "pop" открывается только один канал "sort".

Существует ограничение на число файлов, которые могут быть открыты одновременно. Оператор close (файл) закрывает файл или канал.

Когда открывается или закрывается файл, различные строки являются различными командами.

Назад | Содержание | Вперед