📜  AWK-漂亮印刷

📅  最后修改于: 2020-11-05 03:54:39             🧑  作者: Mango


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

句法

printf fmt, expr-list

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

转义序列

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

新队

下面的例子打印您好世界使用字符单独的线路-

[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

退格键

下面的示例在除最后一个字段之外的每个字段之后打印退格键。它会删除前三个字段中的最后一个数字。例如,字段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

回车

在下面的示例中,在打印完每个字段之后,我们执行回车并在当前打印值的顶部打印下一个值。这意味着,在最终输出中,您只能看到字段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命令以显示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