1.3 格式化輸出
前一節(jié)的 print 語句用于簡單和快速的輸出。如果對輸出格式有更高要求,就要使用 printf 語句。本書后面的例子中,可以看到?printf 語句能生成幾乎任意格式的輸出,不過本節(jié)只會展示它的一小部分能力。細節(jié)可以參考附錄 A.4.3。
對齊域
printf 語句的格式是
printf( format, value1, value2, ... , valuen)
其中的 format 是一個字符串,包含了需要原樣輸出的文本,并在其中穿插著說明 value1~valuen 這些值要如何打印的規(guī)格(specification)。一個規(guī)格就是一個百分號 % ,后面跟著幾個字符來控制value 的格式。第一個規(guī)格指定value1要如何打印,第二個規(guī)格指定value2要如何打印,以此類推。這樣,format 里面有幾個 %?規(guī)格,后面就要有幾個value。(printf語句與標準C庫函數(shù)里的printf函數(shù)基本完全一致)
下面這個程序用 printf 打印每個員工的薪水:
{ printf("total pay for %s is $%.2f\n", $1, $2 * $3) }
上面的規(guī)格字符串里面包含兩個 % 規(guī)格,第一個是 %s,是說把第一個值,即 $1,作為字符串輸出;第二個是 %.2f,是說把第二個值,即 $2 * $3,作為數(shù)字來輸出,并且小數(shù)點后要留兩位。
規(guī)格字符串里的其他東西,包括美元$符號,都是原樣輸出的;字符串結尾的 \n 表示換行,可以讓后續(xù)的輸出從下一行開始。用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) }
其中第一個規(guī)格 %-8s,把名字作為字符串輸出,而且在8個字符寬度下左對齊;其中的減號用于表明左對齊(可以猜到帶加號或者不帶減號就是右對齊了)。第二個規(guī)格 %6.2f,把薪水作為數(shù)字輸出,并且要求小數(shù)點后帶兩位數(shù),6個字符寬:
Beth $ 0.00
Dan $ 0.00
Kathy $155.00
Mark $500.00
Mary $495.00
Susie $306.00
后面還會有很多printf的例子;完整的規(guī)格說明在附錄A.4.3。
對輸出排序
如果你想要打出每個員工的信息和他們的薪水,并按薪水增量排序,最簡單的方法就是用Awk把薪水打印到員工信息前面,并將Awk的輸出交給排序程序。
在Unix上,命令為
awk '{ printf("%6.2f %s\n", $2 * $3, $0) }' emp.data | sort
這會通過管道的方式把Awk的輸出傳給 sort 命令,最后結果如下:文章來源:http://www.zghlxwxcb.cn/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 是效率最高的。(不要自己發(fā)明輪子)文章來源地址http://www.zghlxwxcb.cn/news/detail-689111.html
到了這里,關于AWK語言第二版 1.3 格式化輸出的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!