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的数字。例如Field1显示为Field,因为最后的字符被删除退格。然而,最后一个字段Field4显示,因为我们Field4后没有使用 a \b。

[jerry]$ awk 'BEGIN { printf "Field 1\bField 2\bField 3\bField 4\n" }'
在执行上面的代码后,会得到以下结果:



Field Field Field Field 4

回车

在下面的例子中,每次打印字段之后,做一个回车并打印对当前印刷值之上的下一个值。这意味着,在最后的输出,会看到只有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

The %G format uses %E instead of %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%

使用%的可选参数

使用%,我们可以使用下列可选参数:

宽度

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

[jerry]$ awk 'BEGIN { num1 = 10; num2 = 20; printf "Num1 = %10d\nNum2 = %10d\n", num1, num2 }'
在执行上面的代码后,会得到以下结果:
Num1 =         10
Num2 =         20

前导零

前导0(零)作为一个标志,表示输出应用零而不是空格填充。请注意,该标志只具有一个效果时,字段宽度大于要打印的值。下面的例子说明这一点:

[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

Hash

对于%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


联系我们

邮箱 626512443@qq.com
电话 18611320371(微信)
QQ群 235681453

Copyright © 2015-2024

备案号:京ICP备15003423号-3