Pretty Printing
到目前为止,我们已经使用AWK的print和printf函数在标准输出上显示数据。 但是printf比我们之前看到的要强大得多。 此函数借用C语言,在生成格式化输出时非常有用。 以下是printf语句的语法 -
语法 (Syntax)
printf fmt, expr-list
在上面的语法中, fmt是一串格式规范和常量。 expr-list是与格式说明符对应的参数列表。
转义序列 (Escape Sequences)
与任何字符串类似,格式可以包含嵌入的转义序列。 下面讨论的是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 ,因为最后一个字符用退格键擦除。 但是,最后一个字段Field 4按原样显示,因为我们在Field 4之后没有\b 。
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也有格式说明符。 printf语句的AWK版本接受以下转换规范格式 -
%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和%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
该字段填充到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命令以显示END OF LINE($)字符。
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
Hash
对于%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