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