1.3 格式化输出
前一节的 print 语句用于简单和快速的输出。如果对输出格式有更高要求,就要使用 printf 语句。本书后面的例子中,可以看到 printf 语句能生成几乎任意格式的输出,不过本节只会展示它的一小部分能力。细节可以参考附录 A.4.3。
对齐域
printf 语句的格式是
printf( format, value1, value2, ... , valuen)
其中的 format 是一个字符串,包含了需要原样输出的文本,并在其中穿插着说明 value1~valuen 这些值要如何打印的规格(specification)。一个规格就是一个百分号 % ,后面跟着几个字符来控制value 的格式。第一个规格指定value1要如何打印,第二个规格指定value2要如何打印,以此类推。这样,format 里面有几个 % 规格,后面就要有几个value。(printf语句与标准C库函数里的printf函数基本完全一致)
下面这个程序用 printf 打印每个员工的薪水:
{ printf("total pay for %s is $%.2f\n", $1, $2 * $3) }
上面的规格字符串里面包含两个 % 规格,第一个是 %s,是说把第一个值,即 $1,作为字符串输出;第二个是 %.2f,是说把第二个值,即 $2 * $3,作为数字来输出,并且小数点后要留两位。
规格字符串里的其他东西,包括美元$符号,都是原样输出的;字符串结尾的 \n 表示换行,可以让后续的输出从下一行开始。用emp.data做输入,输出是:
total pay for Beth is $0.00
total pay for Dan is $0.00
total pay for Kathy is $155.00
total pay for Mark is $500.00
total pay for Mary is $495.00
total pay for Susie is $306.00
printf 不像 print 那样会自动打印空格或空行,要的话你得自己指定。如果你忘了 \n, 输出都会在同一行里。(可以去掉 \n 看看效果)
下面这个程序打印每个员工的姓名和薪水:
{ printf("%-8s $%6.2f\n", $1, $2 * $3) }
其中第一个规格 %-8s,把名字作为字符串输出,而且在8个字符宽度下左对齐;其中的减号用于表明左对齐(可以猜到带加号或者不带减号就是右对齐了)。第二个规格 %6.2f,把薪水作为数字输出,并且要求小数点后带两位数,6个字符宽:
Beth $ 0.00
Dan $ 0.00
Kathy $155.00
Mark $500.00
Mary $495.00
Susie $306.00
后面还会有很多printf的例子;完整的规格说明在附录A.4.3。
对输出排序
如果你想要打出每个员工的信息和他们的薪水,并按薪水增量排序,最简单的方法就是用Awk把薪水打印到员工信息前面,并将Awk的输出交给排序程序。
在Unix上,命令为
awk '{ printf("%6.2f %s\n", $2 * $3, $0) }' emp.data | sort
这会通过管道的方式把Awk的输出传给 sort 命令,最后结果如下:文章来源:https://www.toymoban.com/news/detail-689111.html
0.00 Beth 21 0
0.00 Dan 19 0
155.00 Kathy 15.50 10
306.00 Susie 17 18
495.00 Mary 22.50 22
500.00 Mark 25 20
当然也可以在Awk里面写个高效的排序程序;第八章有个快速排序的例子。但大部分时间,用已有的工具比如 sort 是效率最高的。(不要自己发明轮子)文章来源地址https://www.toymoban.com/news/detail-689111.html
到了这里,关于AWK语言第二版 1.3 格式化输出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!