码迷,mamicode.com
首页 > 其他好文 > 详细

格式化打印(二)

时间:2015-06-28 09:58:04      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:awk应用

printf语句可以规定输出域的宽度和对齐方式。一个格式表达式由3个可选的修饰符组成,跟在"%"后面,并出现在格式说明符之前。

%-width.precision format-specifier

描述输出字段宽度的width是一个数值。当指定域宽度时,这个域的内容默认为向右对齐。必须指定"-"来设置左对齐。因此, "%-20s" 输出的走向左对齐的一个域长度为20个字符的字符串,如果字符串少于20个字符,那么这个域将用空格来填满。在下面的例子中,输出一个"1"来指示输出域的真实长度。第一个例子是右对齐的文本:

printf("|%10s|\n", "hello")

结果是:

|    hello|

下一个例子是左对齐的文本:

printf("|%-10s|\n", "hello")

结果是:

|hello    |

precision修饰符用于十进制或浮点数,用于控制小数点右边的数字位数。对于字符串型值,它用于控制要打印的字符的最大数量。注意,数值的默认precision值为"%.6g" 。

可以根据print或printf的参数列表中的值,动态地指定宽度width和精度precision。通过用星号实际的值来实现这个功能:

printf("%*.*g\n",5,3,myvar);

在这个例子中,宽度是5,精度为3,要打印的值来自myvar。

print语句输出数值的默认精度可以通过设置系统变量OFMT来改变。例如,如果使用awk打印报告,其中包含美元($)数值,可以将OFMT设置为"%.2f" 。

使用格式表达式的完整语法可以解决filesum中的各个字段和标题的对齐问题。我们在文件名前输出文件大小的一个原因,就是以这种顺序输出字段对齐的可能性更大,在很大程度上它们可以自己对齐。printf提供给我们的解决方法能够回定输出域的宽度,因此,每个域在相同的列开始。

我们来重新调整filesum报告的输出域。我们希望得到最小的域宽度使得第二个域在相同的位置开始。域宽度应放置在%和转换说明符之间。"%-15s"规定域的宽度为15个字符并且字符左对齐。"%10d"中没有连字符,是右对齐的,这就是我们所希望的十进制值的表示。

printf("%-15s\t%10d\n" , $9, $5)

这将产生一个报告,其中的数据按列对齐并且数字是右对齐的。看一下printf语句在END中是如何被应用的:

printf("Total: %d bytes (%d files)\n" , sum, filenum)

在BEGIN规则中的标题也被适当地改变了。通过使用printf语句。filesum产生如下的结果:

$ ./filesum g*
FILE BYTES
g                      23
gawk                 2237
gawk.mail            1171
gawk.test              74
gawkro                264
gfilesum              610
grades                 64
grades.awk            231
grepscript              6
Total: 4680 bytes (9 files)
参考资料:http://www.linuxawk.com/communication/531.html

格式化打印(二)

标签:awk应用

原文地址:http://blog.csdn.net/xiyangyang052/article/details/46664051

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!