printf语句可以规定输出域的宽度和对齐方式。一个格式表达式由3个可选的修饰符组成,跟在"%"后面,并出现在格式说明符之前。
描述输出字段宽度的width是一个数值。当指定域宽度时,这个域的内容默认为向右对齐。必须指定"-"来设置左对齐。因此, "%-20s" 输出的走向左对齐的一个域长度为20个字符的字符串,如果字符串少于20个字符,那么这个域将用空格来填满。在下面的例子中,输出一个"1"来指示输出域的真实长度。第一个例子是右对齐的文本:
结果是:
下一个例子是左对齐的文本:
结果是:
precision修饰符用于十进制或浮点数,用于控制小数点右边的数字位数。对于字符串型值,它用于控制要打印的字符的最大数量。注意,数值的默认precision值为"%.6g" 。
可以根据print或printf的参数列表中的值,动态地指定宽度width和精度precision。通过用星号实际的值来实现这个功能:
在这个例子中,宽度是5,精度为3,要打印的值来自myvar。
print语句输出数值的默认精度可以通过设置系统变量OFMT来改变。例如,如果使用awk打印报告,其中包含美元($)数值,可以将OFMT设置为"%.2f" 。
使用格式表达式的完整语法可以解决filesum中的各个字段和标题的对齐问题。我们在文件名前输出文件大小的一个原因,就是以这种顺序输出字段对齐的可能性更大,在很大程度上它们可以自己对齐。printf提供给我们的解决方法能够回定输出域的宽度,因此,每个域在相同的列开始。
我们来重新调整filesum报告的输出域。我们希望得到最小的域宽度使得第二个域在相同的位置开始。域宽度应放置在%和转换说明符之间。"%-15s"规定域的宽度为15个字符并且字符左对齐。"%10d"中没有连字符,是右对齐的,这就是我们所希望的十进制值的表示。
这将产生一个报告,其中的数据按列对齐并且数字是右对齐的。看一下printf语句在END中是如何被应用的:
在BEGIN规则中的标题也被适当地改变了。通过使用printf语句。filesum产生如下的结果:
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)