AWK语言第二版 1.3 格式化输出

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 命令,最后结果如下:

  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 是效率最高的。(不要自己发明轮子)

你可能感兴趣的:(AWK,linux,开发语言)