AWK格式化列印


到目前為止,我們已經使用AWK的 print printf 函式來顯示在標準輸出的資料。但 printf 比我們以前見過強大得多。這個函式是從C語言借來的,是非常有幫助的,同時產生格式化輸出。下面是 printf 語句的語法:

printf fmt, expr-list

在上面的語法fmt是格式規範和常數字串。 expr-list是對應於格式說明符的引數列表。

跳脫序列

就像任何字串,格式也可以包含嵌入跳脫序列。下面是由AWK支援跳脫序列的列表:

新的一行

下面的例子列印Hello 和 World 用換行符分開一行:

[jerry]$ awk 'BEGIN { printf "Hello\nWorld\n" }'

在執行上面的程式碼後,會得到以下結果:

Hello
World

水平索引標籤

下面的範例使用水平索引標籤來顯示在不同的欄位中:

[jerry]$ awk 'BEGIN { printf "Sr No\tName\tSub\tMarks\n" }'

在執行上面的程式碼後,會得到以下結果:

Sr No    Name    Sub Marks

垂直索引標籤

下面的範例使用在每個垂直索引標籤欄位後:

[jerry]$ awk 'BEGIN { printf "Sr No\vName\vSub\vMarks\n" }'

在執行上面的程式碼後,會得到以下結果:

Sr No
    Name
        Sub
            Marks

退格鍵

下面的例子列印,除了最後一個每個欄位後,退格。這將擦除前三個Field的數位。例如Field1顯示為Field,因為最後的字元被刪除退格。然而,最後一個欄位Field4顯示,因為我們Field4後沒有使用 a \b。

[jerry]$ awk 'BEGIN { printf "Field 1\bField 2\bField 3\bField 4\n" }'

在執行上面的程式碼後,會得到以下結果:

Field Field Field Field 4

回車

在下面的例子中,每次列印欄位之後,做一個回車並列印對當前印刷值之上的下一個值。這意味著,在最後的輸出,會看到只有4欄位,因為它是印在前面所有的欄位頂部的最後一件事。

[jerry]$ awk 'BEGIN { printf "Field 1\rField 2\rField 3\rField 4\n" }'

在執行上面的程式碼後,會得到以下結果:

Field 4

換頁

下面的例子使用了換頁在列印每個欄位之後。

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

在執行上面的程式碼後,會得到以下結果:

Sr No
    Name
        Sub
            Marks

格式說明

像C語言AWK也有格式說明。AWK版本的printf語句中接受下列轉換規範格式:

%c

它列印一個字元。如果用於%c的引數是數位,它被視為一個字元和列印。否則,引數被假定為一個字串,該字串的唯一第一字元被列印。

[jerry]$ awk 'BEGIN { printf "ASCII value 65 = character %c\n", 65 }'

在執行上面的程式碼後,會得到以下結果:

ASCII value 65 = character A

%d 和 %i

它列印的十進位制數只有整數部分。

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

在執行上面的程式碼後,會得到以下結果:

Percentags = 80

%e 和 %E

它列印格式的浮點數[-] d.dddddde[+-]dd。

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

在執行上面的程式碼後,會得到以下結果:

Percentags = 8.066000e+01

%E格式使用E代替e。

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

在執行上面的程式碼後,會得到以下結果:

Percentags = 8.066000E+01

%f

它列印格式的浮點數 [-]ddd.dddddd.

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

在執行上面的程式碼後,會得到以下結果:

Percentags = 80.660000

%g 和 %G

使用%e或%f轉換,以較短者為準,具有抑制非顯著零。

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

在執行上面的程式碼後,會得到以下結果:

Percentags = 80.66

The %G format uses %E instead of %e.

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

在執行上面的程式碼後,會得到以下結果:

Percentags = 80.66

%o

它列印一個無符號的八進位制數。

[jerry]$ awk 'BEGIN { printf "Octal representation of decimal number 10 = %o\n", 10}'

在執行上面的程式碼後,會得到以下結果:

Octal representation of decimal number 10 = 12

%u

它列印一個無符號的十進位制數。

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

在執行上面的程式碼後,會得到以下結果:

Unsigned 10 = 10

%s

它列印字串。

[jerry]$ awk 'BEGIN { printf "Name = %s\n", "Sherlock Holmes" }'

在執行上面的程式碼後,會得到以下結果:

Name = Sherlock Holmes

%x 和 %X

它列印一個無符號的十六進位制數。在%X格式使用大寫字母而不是小寫。

[jerry]$ awk 'BEGIN { printf "Hexadecimal representation of decimal number 15 = %x\n", 15}'

在執行上面的程式碼後,會得到以下結果:

Hexadecimal representation of decimal number 15 = f

現在,讓我們使用使用%X和觀察結果:

[jerry]$ awk 'BEGIN { printf "Hexadecimal representation of decimal number 15 = %X\n", 15}'

在執行上面的程式碼後,會得到以下結果:

Hexadecimal representation of decimal number 15 = F

%%

它列印一個字元%,沒有引數轉換。

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

在執行上面的程式碼後,會得到以下結果:

Percentags = 80%

使用%的可選引數

使用%,我們可以使用下列可選引數:

寬度

該欄位將被填充到寬度。預設情況下,欄位用空格填充,但是當0標誌時,它是用零填充。

[jerry]$ awk 'BEGIN { num1 = 10; num2 = 20; printf "Num1 = %10d\nNum2 = %10d\n", num1, num2 }'

在執行上面的程式碼後,會得到以下結果:

Num1 =         10
Num2 =         20

前導零

前導0(零)作為一個標誌,表示輸出應用零而不是空格填充。請注意,該標誌只具有一個效果時,欄位寬度大於要列印的值。下面的例子說明這一點:

[jerry]$ awk 'BEGIN { num1 = -10; num2 = 20; printf "Num1 = %05d\nNum2 = %05d\n", num1, num2 }'

在執行上面的程式碼後,會得到以下結果:

Num1 = -0010
Num2 = 00020

左對齊

表示式應該是左對齊的欄位。緊接著%在數位之前- 當輸入字串小於指定的字元數,希望它是左對齊,即通過增加空間向右,使用減號(-)。在下面的例子中,AWK命令的輸出管道到cat命令顯示END OF LINE($)字元。

[jerry]$ awk 'BEGIN { num = 10; printf "Num = %-5d\n", num }' | cat -vte

在執行上面的程式碼後,會得到以下結果:

Num = 10   $

字首符號

它總是字首數位值用一個符號,即使該值是正的。

[jerry]$ awk 'BEGIN { num1 = -10; num2 = 20; printf "Num1 = %+d\nNum2 = %+d\n", num1, num2 }'

在執行上面的程式碼後,會得到以下結果:

Num1 = -10
Num2 = +20

Hash

對於%o,它提供一個前導零。對於%x和%X,它提供了一個0x或0X分別只有結果是零。對於%e, %E, %f 和%F,結果總是包含一個小數點。對於%g和%G,後邊的零不會從結果中刪除。下面簡單的例子說明這一點:

[jerry]$ awk 'BEGIN { printf "Octal representation = %#o\nHexadecimal representaion = %#X\n", 10, 10}'

在執行上面的程式碼後,會得到以下結果:

Octal representation = 012
Hexadecimal representation = 0XA