前面我們已經(jīng)用過了 AWK 中的 print 函數(shù)與 printf 函數(shù),它們將數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出流中。其實 printf 函數(shù)的功能遠(yuǎn)比我們前面演示的強(qiáng)大。這個函數(shù)是從 C 語言中借鑒來而的,主要用于生成格式化的輸出。下面是 printf 的使用方法:
printf fmt, expr-list
其中,fmt 是字符串常量或者格式規(guī)格說明字符串,expr-list 是與格式說明相對應(yīng)的參數(shù)列表。
與一般字符串一樣,格式化字符串也能內(nèi)嵌轉(zhuǎn)義序列。 AWK 支持的轉(zhuǎn)義序列如下:
下面的例子中使用換行符將 Hello 與 World 分開輸出到獨立兩行:
[jerry]$ awk 'BEGIN { printf "Hello\nWorld\n" }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Hello
World
如下示例,使用制表符顯示不同的域:
[jerry]$ awk 'BEGIN { printf "Sr No\tName\tSub\tMarks\n" }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Sr No Name Sub Marks
如下示例,使用垂直制表符輸出不同域:
[jerry]$ awk 'BEGIN { printf "Sr No\vName\vSub\vMarks\n" }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Sr No
Name
Sub
Marks
下面的例子中,我們在每個域輸出后都再輸出退格符(最后一個域除外)。這樣前三個域的每一域的最后一個字符都會被刪除。比如說,F(xiàn)ield 1 輸出為 Field。因為最后一個字符被退格符刪除。不過Field 4可以正常顯示,因為在Field 4輸出后沒有輸出退格符。
[jerry]$ awk 'BEGIN { printf "Field 1\bField 2\bField 3\bField 4\n" }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Field Field Field Field 4
下面的例子中,我們在每個域輸出后輸出一個回車符,隨后輸出的域會覆蓋之前輸出的內(nèi)容。也就是說,我們只能看到最后輸出的 Field 4。
[jerry]$ awk 'BEGIN { printf "Field 1\rField 2\rField 3\rField 4\n" }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Field 4
下面的例子中每個域后輸出后輸出一個換頁符:
[jerry]$ awk 'BEGIN { printf "Sr No\fName\fSub\fMarks\n" }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Sr No
Name
Sub
Marks
與 C 語言一樣,AWK 也定義了格式說明符。 AWK 的 printf 允許如下的格式的轉(zhuǎn)換:
輸出單個字符。如果參數(shù)是個數(shù)值,那么數(shù)值也會被當(dāng)作字符然后輸出。如果參數(shù)是字符串,那么只會輸出字符串的第一個字符。
[jerry]$ awk 'BEGIN { printf "ASCII value 65 = character %c\n", 65 }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
ASCII value 65 = character A
輸出十進(jìn)制數(shù)的整數(shù)部分。
[jerry]$ awk 'BEGIN { printf "Percentags = %d\n", 80.66 }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Percentags = 80
以 [-]d.dddddde[+-]dd 的格式輸出浮點數(shù)。
[jerry]$ awk 'BEGIN { printf "Percentags = %E\n", 80.66 }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Percentags = 8.066000e+01
%E 格式使用 E 而不是 e。
[jerry]$ awk 'BEGIN { printf "Percentags = %e\n", 80.66 }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Percentags = 8.066000E+01
以 [-]ddd.dddddd 的格式輸出浮點數(shù)。
[jerry]$ awk 'BEGIN { printf "Percentags = %f\n", 80.66 }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Percentags = 80.660000
輸出浮點數(shù),使用 %e 或 %E 轉(zhuǎn)換。但它們會刪除那些對數(shù)值無影響的 0。
[jerry]$ awk 'BEGIN { printf "Percentags = %g\n", 80.66 }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Percentags = 80.66
%G 使用 %E 格式化,而不是 %e。
[jerry]$ awk 'BEGIN { printf "Percentags = %e\n", 80.66 }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Percentags = 80.66
無符號八進(jìn)制輸出。
[jerry]$ awk 'BEGIN { printf "Octal representation of decimal number 10 = %o\n", 10}'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Octal representation of decimal number 10 = 12
無符號十進(jìn)制數(shù)輸出。
[jerry]$ awk 'BEGIN { printf "Unsigned 10 = %u\n", 10 }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Unsigned 10 = 10
輸出十六進(jìn)制無符號數(shù)。%X 中使用大寫字母,%x 使用小寫字母。
[jerry]$ awk 'BEGIN { printf "Hexadecimal representation of decimal number 15 = %x\n", 15}'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Hexadecimal representation of decimal number 15 = f
使用 %X 的輸出結(jié)果如下:
[jerry]$ awk 'BEGIN { printf "Hexadecimal representation of decimal number 15 = %X\n", 15}'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Hexadecimal representation of decimal number 15 = F
輸出百分號(%),不需要輸入?yún)?shù)。
[jerry]$ awk 'BEGIN { printf "Percentags = %d%%\n", 80.66 }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Percentags = 80%
% 可以使用如下可選參數(shù):
輸出域會被填充滿足寬度要求。默認(rèn)情況下使用空格字符填充。但是,當(dāng)標(biāo)志 0 被設(shè)置后會使用 0 填充。
[jerry]$ awk 'BEGIN { num1 = 10; num2 = 20; printf "Num1 = %10d\nNum2 = %10d\n", num1, num2 }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Num1 = 10
Num2 = 20
緊接在 % 后的零被當(dāng)作標(biāo)示,表示輸出應(yīng)該使用零填充而不是空格字符。請注意,只有當(dāng)域的寬度比要求寬度小時該標(biāo)示才會有效。示例如下:
[jerry]$ awk 'BEGIN { num1 = -10; num2 = 20; printf "Num1 = %05d\nNum2 = %05d\n", num1, num2 }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Num1 = -0010
Num2 = 00020
輸出域被設(shè)置為左對齊。當(dāng)輸出字符串字符數(shù)比指定寬度少時,你可能希望在輸出它時能左對齊。比如,在右邊添加空格符。在 % 之后數(shù)字之前使用減號(-)即可指定輸出左對齊。下面的例子中,AWK 的輸出做為 cat 的輸入,在 cat 中輸出行結(jié)束符號($)。
[jerry]$ awk 'BEGIN { num = 10; printf "Num = %-5d\n", num }' | cat -vte
執(zhí)行上面的命令可以得到如下的結(jié)果:
Num1 = -0010
Num2 = 00020
輸出數(shù)值的符號,正號也輸出。
[jerry]$ awk 'BEGIN { num1 = -10; num2 = 20; printf "Num1 = %+d\nNum2 = %+d\n", num1, num2 }'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Num1 = -10
Num2 = +20
使用 Hash 可以為 %o 的結(jié)果前添加0,為 %x 或 %X 輸出的結(jié)果前添加 0x 或 0X (結(jié)果不為零時),為 %e,%E,%f,%F添加小數(shù)點;對于 %g 或 %G,使用哈??梢员A粑膊康牧恪J褂檬纠缦拢?
[jerry]$ awk 'BEGIN { printf "Octal representation = %#o\nHexadecimal representaion = %#X\n", 10, 10}'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Octal representation = 012
Hexadecimal representation = 0XA
更多建議: