printf 是 awk 的重要格式化輸出命令,本節我們先介紹一下 printf 命令如何使用。
需要注意,在 awk 中可以識別 print 輸出動作和 printf 輸出動作(區別是:print 會在每個輸出之後自動加入一個換行符;而 printf 是標準格式輸出命令,並不會自動加入換行符,如果需要換行,則需要手工加入換行符),但是在 Bash 中只能識別標準格式化輸出命令 printf。所以我們在本小節中介紹的是標準格式化輸出命令 printf。
printf 命令格式如下:
[[email protected] ~]# printf '輸出型別輸出格式' 輸出內容
輸出型別:
-
%ns:輸出字串。n 是數位,指代輸出幾個字元;
-
%ni:輸出整數。n 是數位,指代輸出幾個數位‘’
-
%m.nf: 輸出浮點數。m 和 n 是數位,指代輸出的整數位數和小數位數。如 %8.2f 代表共輸出 8 位數,其中 2 位是小數,6 位是整數;
輸出格式:
-
a: 輸出警告聲音;
-
b:輸出退格鍵,也就是 Backspaced 鍵;
-
f:清除螢幕;
-
n:換行;
-
r:回車,也就是 Enter 鍵;
-
t:水平輸出退格鍵,也就是 Tab 鍵;
-
v:垂直輸出退格鍵,也就是 Tab 鍵;
為了演示 printf 命令,我們需要修改一下剛剛 cut 命令使用的 student.txt 檔案。檔案內容如下:
[[email protected] ~]# vi student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
我們使用 printf 命令輸出這個檔案的內容,如下:
[[email protected] ~]# printf '%s' $(cat student.txt)
IDNamegenderPHPUnuxMySQl_Average1LjmingM82 958687.662ScM74968785.663GaoM998393 91.66
[[email protected] ~]#
輸出結果十分混亂。這就是 printf 命令,如果不指定輸出格式,則會把所有輸出內容連在一起輸出。其實文字的輸出本身就是這樣的,cat 等文字輸出命令之所以可以按照格式漂亮地輸出,那是因為 cat 命令已經設定了輸出格式。
那麼,為了用 printf 輸出合理的格式,應該這樣做:
[[email protected] ~]# printf '%st %st %st %st %st %stn' $(cat student.txt)
#注意:在printf命令的單引號中只能識別格式輸出符號,而手工輸入的空格是無效的
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
再強調一下:在 printf 命令的單引號中輸入的任何空格都不會反映到格式輸出中,只有格式輸出符號才能影響 printf 命令的輸出結果。
解釋一下這個命令:因為我們的文件有6列,所以使用 6 個"%s"代表這 6 列字串,每個字串之間用"t"分隔;最後還要加入"n",使得每行輸出都換行,否則這些資料還是會連成一行的。
如果不想把成績當成字串輸出,而是按照整型和浮點型輸出,則要這樣做:
[[email protected] ~]# printf '%it %st %it %it %it %8.2ftn'
$(cat student.txt | grep -v Name)
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Gao 99 83 93 91.66
先解釋"cat student.txt|grep -v Name"這條命令。這條命令會把第一行標題取消,剩餘的內容才用 printf 格式化輸出。在剩餘的內容中,第 1、3、4、5 列為整型,所以用"%i"輸出;而第 2 列是字串,所以用"%s"輸出;而第 6 列是小數,所以用"%8.2f"輸出。"%8.2f"代表可以輸出 8 位數,其中有 2 位是小數,有 6 位是整數。
printf 命令是 awk 中重要的輸出動作,不過 awk 中也能識別 print 動作,區別剛剛已經介紹了,當然稍後我們還會舉例來說明一下這兩個動作的區別。注意:在 Bash 中只有 printf 命令。另外,printf 命令只能格式化輸出具體資料,不能直接輸出檔案內容或使用管道符,所以 printf 命令的格式還是比較特殊的。