AWK 優(yōu)雅的輸出

2018-08-30 15:22 更新

優(yōu)雅地輸出

前面我們已經(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ù)列表。

轉(zhuǎn)義序列

與一般字符串一樣,格式化字符串也能內(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

換頁(yè)符

下面的例子中每個(gè)域后輸出后輸出一個(gè)換頁(yè)符:

[jerry]$ awk 'BEGIN { printf "Sr No\fName\fSub\fMarks\n" }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

Sr No
    Name
        Sub
            Marks

格式說(shuō)明符

與 C 語(yǔ)言一樣,AWK 也定義了格式說(shuō)明符。 AWK 的 printf 允許如下的格式的轉(zhuǎn)換:

%c

輸出單個(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

%d 與 %i

輸出十進(jìn)制數(shù)的整數(shù)部分。

[jerry]$ awk 'BEGIN { printf "Percentags = %d\n", 80.66 }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

Percentags = 80

%e 與 %E

以 [-]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

%f

以 [-]ddd.dddddd 的格式輸出浮點(diǎn)數(shù)。

[jerry]$ awk 'BEGIN { printf "Percentags = %f\n", 80.66 }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

Percentags = 80.660000

%g 與 %G

輸出浮點(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

%o

無(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

%u

無(wú)符號(hào)十進(jìn)制數(shù)輸出。

[jerry]$ awk 'BEGIN { printf "Unsigned 10 = %u\n", 10 }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

Unsigned 10 = 10

%x 與 %X

輸出十六進(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ù)

% 可以使用如下可選參數(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ǎo)零

緊接在 % 后的零被當(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

左對(duì)齊

輸出域被設(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

符號(hào)前綴

輸出數(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)

使用 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
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)