Чтение онлайн

ЖАНРЫ

Linux и UNIX: программирование в shell. Руководство разработчика
Шрифт:

Восьмеричный код символа

\c

Любой другой специальный символ. Например, запись \\ соответствует символу обратной косой черты

В следующей команде сначала отображается фраза "May Day", в которой слова разделены символом табуляции, а затем выводятся два символа новой строки, вследствие чего образуется пустая строка. Потом отображается слово "May", а за ним -cлово "Day", каждая буква которого представлена ASCII–кодом: 'D' — 104, 'а'- 141,'у'- 171.

$ awk BEGIN {print "May\tDay\n\nMay \104\141\171"}'

May Day

May Day

9.2.12. Команда printf

Во всех примерах, с которыми мы ознакомились, данные выводились на экран с помощью команды print без какого-либо форматирования. В awk имеется намного более мощная команда printf, аналог одноименной функции языка С, позволяющая задавать правила форматирования выходных данных.

Базовый синтаксис команды таков:

printf "строка_формaтирования", аргументы

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

Таблица 9.6. Спецификаторы форматирования

%c

Символ ASCI I; если аргумент является строкой, выводится первый символ строки

%d, %i

Целое число

%e

Число с плавающей точкой в формате [-]d.dddddde[+-]dd

%E

Аналогичен спецификатору %e, но знак экспоненты представлен символом 'E', а не 'e'

%f

Число с плавающей точкой в формате [~}ddd.dddddd

%G

Тип преобразования будет %e или %f в зависимости от того, какой результат короче; вывод незначащих нулей подавляется Аналогичен спецификатору %g, но экспоненциальный формат будет представлен спецификатором %E, а не %e .

%o

Восьмеричное число без знака

%s

Строка символов

%x

Шестнадцатеричное число без знака (используются шестнадцатеричные

цифры а, b, с, d, e, f)

Аналогичен спецификатору %x, но используются шестнадцатеричные

цифры А, В, С, D, E, F

%%

Отображается символ '%', интерпретации аргумента не происходит

В состав спецификаторов форматирования могут входить различные модификаторы, определяющие дополнительные особенности форматирования (табл. 9.7). Модификатор помещается между символом '%' и управляющим символом.

Таблица 9.7. Дополнительные модификаторы

Аргумент выравнивается по левому краю поля вывода (по умолчанию принято правостороннее выравнивание)

пробел

Если аргумент является положительным числом, перед ним ставится

пробел, а если отрицательным — знак минус

+

Если аргумент является числом, ему всегда предшествует знак плюс,

даже если это положительное число

#

Выбирается альтернативная форма спецификатора:

%о — восьмеричному числу предшествует ведущий ноль;

%x — шестнадцатеричному числу предшествует запись 0x;

%x — шестнадцатеричному числу предшествует запись Оx;

%e, %E, %f — число всегда содержит десятичную точку;

%g, %G — вывод незначащих нулей не подавляется

0

Если длина поля вывода больше, чем число символов в представлении

аргумента, аргумент дополняется нулями, а не пробелами

ширина

Ширина поля вывода; если длина поля больше, чем число символов

в представлении аргумента, аргумент по умолчанию дополняется

пробелами

. точность

Точность представления аргумента:

%е, %е, %f — число символов после десятичной точки;

%g, %g — максимальное число значащих цифр;

%d, %o, %i, %u, %x, %X — минимальное число выводимых цифр;

% s — максимальное число выводимых символов

Преобразование символов

Чтобы узнать, ASCII–код какого символа равен 65, можно с помощью команды echo направить строку "65" утилите awk и затем передать ее в качестве аргумента команде printf со спецификатором %с. Команда printf выполнит преобразование автоматически:

$ echo "65" | awk '{printf "%c\n", $0}'

A

Как видите, это символ 'A'. Обратите внимание на наличие в команде символа новой строки (\n). Необходимость в нем объясняется тем, что команда printf по умолчанию не записывает этот символ в выходной поток. Если не указать Escape–последовательность \n, сразу после буквы 'А' в той же строке будет отображено приглашение интерпретатора shell, что может смутить пользователя, работающего в данный момент за терминалом.

Конечно, код символа может быть указан непосредственно в команде printf:

$ awk 'BEGIN {printf "%c\n", 65}'

A

Форматированный вывод

Предположим, необходимо отобразить имена учеников и их идентификаторы, причем имена должны быть выровнены по левому краю и размещаться в поле длиной 15 символов. В конце строки форматирования стоит символ новой строки (\n(,

служащий для разделения записей. Выводимые данные будут размещаться в двух колонках:

$ awk '{printf "%-l5s %d\n", $1, $3}' grade.txt

M. Tansley 48311

J. Lulu 48311

P. Bunny 4 8

J. Troll 4842

L. Tansley 4712

9.2.13. Передача переменных утилите awk

Переменные можно создавать не только в сценарии awk, но и непосредственно в командной строке. Формат вызова утилиты awk в этом случае таков:

awk 'сценарий' переменная=значение входной_файл

В следующем примере переменная AGE создается в командной строке и инициализируется значением 10. Показанная команда находит студентов, возраст которых не превышает 10 лет.

Поделиться с друзьями: