- AWK 教程
- AWK - 首页
- AWK - 概述
- AWK - 环境
- AWK - 工作流程
- AWK - 基本语法
- AWK - 基本示例
- AWK - 内置变量
- AWK - 运算符
- AWK - 正则表达式
- AWK - 数组
- AWK - 控制流
- AWK - 循环
- AWK - 内置函数
- AWK - 用户自定义函数
- AWK - 输出重定向
- AWK - 漂亮打印
- AWK 有用资源
- AWK - 快速指南
- AWK - 有用资源
- AWK - 讨论
AWK - 漂亮打印
到目前为止,我们已经使用了 AWK 的 print 和 printf 函数在标准输出上显示数据。但是 printf 比我们之前看到的要强大得多。此函数是从 C 语言借用的,在生成格式化输出时非常有用。以下是 printf 语句的语法:
语法
printf fmt, expr-list
在上面的语法中,fmt 是格式说明和常量的字符串。expr-list 是与格式说明符相对应的参数列表。
转义序列
与任何字符串类似,格式可以包含嵌入的转义序列。下面讨论的是 AWK 支持的转义序列:
换行符
以下示例使用换行符在单独的行中打印 Hello 和 World:
示例
[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 也具有格式说明符。printf 语句的 AWK 版本接受以下转换规范格式:
%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。默认情况下,字段用空格填充,但当使用 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 命令以显示行尾 ($) 字符。
示例
[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