AWK - красивая печать

До сих пор мы использовали AWK print а также printfфункции для вывода данных на стандартный вывод. Но printf намного мощнее того, что мы видели раньше. Эта функция заимствована из языка C и очень полезна при создании форматированного вывода. Ниже приведен синтаксис оператора printf -

Синтаксис

printf fmt, expr-list

В приведенном выше синтаксисе fmt представляет собой строку спецификаций формата и констант. expr-list это список аргументов, соответствующих спецификаторам формата.

Последовательности побега

Как и любая строка, формат может содержать встроенные escape-последовательности. Ниже обсуждаются escape-последовательности, поддерживаемые AWK -

Новая линия

В следующем примере печатается Hello а также World в отдельных строках с использованием символа новой строки -

Example

[jerry]$ awk 'BEGIN { printf "Hello\nWorld\n" }'

Выполнив этот код, вы получите следующий результат -

Output

Hello
World

Горизонтальная вкладка

В следующем примере используется горизонтальная вкладка для отображения другого поля -

Example

[jerry]$ awk 'BEGIN { printf "Sr No\tName\tSub\tMarks\n" }'

Выполнив приведенный выше код, вы получите следующий результат -

Output

Sr No   Name    Sub Marks

Вертикальная табуляция

В следующем примере используется вертикальная табуляция после каждого поля -

Example

[jerry]$ awk 'BEGIN { printf "Sr No\vName\vSub\vMarks\n" }'

Выполнив этот код, вы получите следующий результат -

Output

Sr No
   Name
      Sub
         Marks

Backspace

В следующем примере после каждого поля, кроме последнего, печатается возврат. Удаляет последнее число из первых трех полей. Например,Field 1 отображается как Field, потому что последний символ удаляется с помощью Backspace. Однако последнее полеField 4 отображается как есть, поскольку у нас не было \b после Field 4.

Example

[jerry]$ awk 'BEGIN { printf "Field 1\bField 2\bField 3\bField 4\n" }'

Выполнив этот код, вы получите следующий результат -

Output

Field Field Field Field 4

Возврат каретки

В следующем примере после печати каждого поля мы выполняем Carriage Return и напечатайте следующее значение поверх текущего напечатанного значения. Это означает, что в окончательном выводе вы можете увидеть толькоField 4, так как это было последнее, что печаталось поверх всех предыдущих полей.

Example

[jerry]$ awk 'BEGIN { printf "Field 1\rField 2\rField 3\rField 4\n" }'

Выполнив этот код, вы получите следующий результат -

Output

Field 4

Подача формы

В следующем примере используется подача формы после печати каждого поля.

Example

[jerry]$ awk 'BEGIN { printf "Sr No\fName\fSub\fMarks\n" }'

Выполнив этот код, вы получите следующий результат -

Output

Sr No
   Name
      Sub
         Marks

Описатель формата

Как и в языке C, AWK также имеет спецификаторы формата. Версия AWK оператора printf принимает следующие форматы спецификации преобразования:

% c

Он печатает один символ. Если аргумент, используемый для%cявляется числовым, обрабатывается как символ и печатается. В противном случае предполагается, что аргумент является строкой, и печатается единственный первый символ этой строки.

Example

[jerry]$ awk 'BEGIN { printf "ASCII value 65 = character %c\n", 65 }'

Output

Выполнив этот код, вы получите следующий результат -

ASCII value 65 = character A

% d и% i

Он печатает только целую часть десятичного числа.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %d\n", 80.66 }'

Выполнив этот код, вы получите следующий результат -

Output

Percentags = 80

% e и% E

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

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %E\n", 80.66 }'

Выполнив этот код, вы получите следующий результат -

Output

Percentags = 8.066000e+01

В %E формат использует E вместо e.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %e\n", 80.66 }'

Выполнив этот код, вы получите следующий результат -

Output

Percentags = 8.066000E+01

% f

Он печатает число с плавающей запятой в форме [-] ddd.dddddd.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %f\n", 80.66 }'

Выполнив этот код, вы получите следующий результат -

Output

Percentags = 80.660000

% г и% G

Использует преобразование% e или% f, в зависимости от того, что короче, с подавлением незначащих нулей.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %g\n", 80.66 }'

Output

Выполнив этот код, вы получите следующий результат -

Percentags = 80.66

В %G формат использует %E вместо% e.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %G\n", 80.66 }'

Выполнив этот код, вы получите следующий результат -

Output

Percentags = 80.66

% o

Он печатает восьмеричное число без знака.

Example

[jerry]$ awk 'BEGIN { printf "Octal representation of decimal number 10 = %o\n", 10}'

Выполнив этот код, вы получите следующий результат -

Output

Octal representation of decimal number 10 = 12

% u

Он печатает десятичное число без знака.

Example

[jerry]$ awk 'BEGIN { printf "Unsigned 10 = %u\n", 10 }'

Выполнив этот код, вы получите следующий результат -

Output

Unsigned 10 = 10

% s

Он печатает строку символов.

Example

[jerry]$ awk 'BEGIN { printf "Name = %s\n", "Sherlock Holmes" }'

Выполнив этот код, вы получите следующий результат -

Output

Name = Sherlock Holmes

% x и% X

Он печатает шестнадцатеричное число без знака. В%X формат использует прописные буквы вместо строчных.

Example

[jerry]$ awk 'BEGIN { 
   printf "Hexadecimal representation of decimal number 15 = %x\n", 15
}'

Выполнив этот код, вы получите следующий результат -

Output

Hexadecimal representation of decimal number 15 = f

Теперь позвольте использовать% X и наблюдать результат -

Example

[jerry]$ awk 'BEGIN { 
   printf "Hexadecimal representation of decimal number 15 = %X\n", 15
}'

Выполнив этот код, вы получите следующий результат -

Output

Hexadecimal representation of decimal number 15 = F

%%

Он печатает сингл % символ и аргумент не преобразуется.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %d%%\n", 80.66 }'

Выполнив этот код, вы получите следующий результат -

Output

Percentags = 80%

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

С участием % мы можем использовать следующие необязательные параметры -

Ширина

Поле дополняется до width. По умолчанию поле заполняется пробелами, но когда используется флаг 0, оно дополняется нулями.

Example

[jerry]$ awk 'BEGIN { 
   num1 = 10; num2 = 20; printf "Num1 = %10d\nNum2 = %10d\n", num1, num2 
}'

Выполнив этот код, вы получите следующий результат -

Output

Num1 =         10
Num2 =         20

Ведущие нули

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

Example

[jerry]$ awk 'BEGIN { 
   num1 = -10; num2 = 20; printf "Num1 = %05d\nNum2 = %05d\n", num1, num2 
}'

Выполнив этот код, вы получите следующий результат -

Output

Num1 = -0010
Num2 = 00020

Левое обоснование

Выражение должно быть выровнено по левому краю в пределах своего поля. Если строка ввода меньше указанного количества символов и вы хотите, чтобы она была выровнена по левому краю, то есть путем добавления пробелов справа, используйте символ минус (-) сразу после% и перед числом.

В следующем примере вывод команды AWK передается по конвейеру команде cat для отображения символа КОНЕЦ СТРОКИ ($).

Example

[jerry]$ awk 'BEGIN { num = 10; printf "Num = %-5d\n", num }' | cat -vte

Выполнив этот код, вы получите следующий результат -

Output

Num = 10   $

Знак префикса

Он всегда ставит перед числовыми значениями знак, даже если значение положительное.

Example

[jerry]$ awk 'BEGIN { 
   num1 = -10; num2 = 20; printf "Num1 = %+d\nNum2 = %+d\n", num1, num2 
}'

Выполнив этот код, вы получите следующий результат -

Output

Num1 = -10
Num2 = +20

Хеш

Для% o он предоставляет начальный ноль. Для% x и% X он предоставляет начальные 0x или 0X соответственно, только если результат не равен нулю. Для% e,% E,% f и% F результат всегда содержит десятичную точку. Для% g и% G конечные нули не удаляются из результата. Следующий пример описывает это -

Example

[jerry]$ awk 'BEGIN { 
   printf "Octal representation = %#o\nHexadecimal representaion = %#X\n", 10, 10
}'

Выполнив этот код, вы получите следующий результат -

Output

Octal representation = 012
Hexadecimal representation = 0XA