AWK - 格式化打印

到目前为止,我们已经使用了 AWK 的 printprintf 函数在标准输出上显示数据。 但是 printf 比我们之前看到的要强大得多。 该函数是从 C 语言中借用的,在生成格式化输出时非常有用。 下面是 printf 语句的语法 −

语法

printf fmt, expr-list

在上述语法中,fmt 是一串格式规范和常量。 expr-list 是对应于格式说明符的参数列表。


转义序列

与任何字符串类似,格式可以包含嵌入的转义序列。 下面讨论的是 AWK 支持的转义序列 −

新行

以下示例使用换行符将 HelloWorld 打印在不同的行中 −

示例

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

在执行此代码时,您会得到以下结果 −

输出

Hello
World

水平制表符

以下示例使用水平制表符显示不同的字段 −

示例

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

在执行上述代码时,您会得到以下结果 −

输出

Sr No   Name    Sub Marks

垂直制表符

以下示例在每个字段后使用垂直制表符 −

示例

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

在执行此代码时,您会得到以下结果 −

输出

Sr No
   Name
      Sub
         Marks

退格

以下示例在除最后一个字段之外的每个字段之后打印一个退格键。它从前三个字段中删除最后一个数字。 例如,Field 1 显示为 Field,因为最后一个字符被退格删除。但是,最后一个字段 Field 4 会按原样显示,因为我们在 Field 4 之后没有 \b

示例

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

在执行此代码时,您会得到以下结果 −

输出

Field Field Field Field 4

回车

在下面的示例中,在打印每个字段后,我们执行 回车 并在当前打印值的顶部打印下一个值。这意味着,在最终输出中,您只能看到 Field 4,因为它是打印在所有先前字段之上的最后一件事。

示例

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

在执行此代码时,您会得到以下结果 −

输出

Field 4

换页

以下示例在打印每个字段后使用换页。

示例

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

在执行此代码时,您会得到以下结果 −

输出

Sr No
   Name
      Sub
         Marks

格式说明符

与 C 语言一样,AWK 也有格式说明符。 AWK 版本的 printf 语句接受以下转换规范格式 −

%c

它打印一个字符。 如果用于 %c 的参数是数字,则将其视为字符并打印。 否则,参数被假定为一个字符串,并打印该字符串的唯一第一个字符。

示例

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

输出

在执行此代码时,您会得到以下结果 −

ASCII value 65 = character A

%d 和 %i

它只打印十进制数的整数部分。

示例

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

在执行此代码时,您会得到以下结果 −

输出

Percentags = 80

%e 和 %E

它打印 [-]d.dddddde[+-]dd 形式的浮点数。

示例

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

在执行此代码时,您会得到以下结果 −

输出

Percentags = 8.066000e+01

%E 格式使用 E 而不是 e。

示例

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

在执行此代码时,您会得到以下结果 −

输出

Percentags = 8.066000E+01

%f

它打印 [-]ddd.dddddd 形式的浮点数。

示例

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

在执行此代码时,您会得到以下结果 −

输出

Percentags = 80.660000

%g 和 %G

使用 %e 或 %f 转换,以较短者为准,并抑制非有效零。

示例

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

输出

在执行此代码时,您会得到以下结果 −

Percentags = 80.66

%G 格式使用 %E 而不是 %e。

示例

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

在执行此代码时,您会得到以下结果 −

输出

Percentags = 80.66

%o

它打印一个无符号八进制数。

示例

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

在执行此代码时,您会得到以下结果 −

输出

Octal representation of decimal number 10 = 12

%u

它打印一个无符号十进制数。

示例

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

在执行此代码时,您会得到以下结果 −

输出

Unsigned 10 = 10

%s

它打印一个字符串。

示例

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

在执行此代码时,您会得到以下结果 −

输出

Name = Sherlock Holmes

%x 和 %X

它打印一个无符号的十六进制数。 %X 格式使用大写字母而不是小写字母。

示例

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

在执行此代码时,您会得到以下结果 −

输出

Hexadecimal representation of decimal number 15 = f

现在让我们使用 %X 并观察结果 −

示例

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

在执行此代码时,您会得到以下结果 −

输出

Hexadecimal representation of decimal number 15 = F

%%

它打印单个 % 字符并且不转换任何参数。

示例

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

在执行此代码时,您会得到以下结果 −

输出

Percentags = 80%

带 % 的可选参数

使用 % 我们可以使用以下可选参数 −

Width

该字段被填充到 width。 默认情况下,该字段用空格填充,但是当使用 0 标志时,它用零填充。

示例

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

在执行此代码时,您会得到以下结果 −

输出

Num1 =         10
Num2 =         20

前导零

前导零作为一个标志,表示输出应该用零而不是空格填充。 请注意,此标志仅在字段比要打印的值宽时才有效。 以下示例对此进行了说明 −

示例

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

在执行此代码时,您会得到以下结果 −

输出

Num1 = -0010
Num2 = 00020

左对齐

表达式应在其字段内左对齐。 如果输入字符串小于指定的字符数,并且您希望它左对齐,即通过在右侧添加空格,请在 % 之后和数字之前使用减号 (–)。

在以下示例中,AWK 命令的输出通过管道传送到 cat 命令以显示 END OF LINE($) 字符。

示例

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

在执行此代码时,您会得到以下结果 −

输出

Num = 10   $

前缀符号

它总是在数字值前面加上一个符号,即使该值是正数。

示例

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

在执行此代码时,您会得到以下结果 −

输出

Num1 = -10
Num2 = +20

哈希

对于 %o,它提供前导零。 对于 %x 和 %X,它分别提供前导 0x 或 0X,仅当结果为非零时。 对于 %e、%E、%f 和 %F,结果始终包含小数点。 对于 %g 和 %G,不会从结果中删除尾随零。 以下示例对此进行了说明 −

示例

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

在执行此代码时,您会得到以下结果 −

输出

Octal representation = 012
Hexadecimal representation = 0XA