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