awk的printf格式化輸出
20121108 Chenxin
cat sort_result.txt
223 浙江省
207 上海市
168 廣東省
149 山東省
128 江蘇省
114 雲南省
111 四川省
需要將該文件中的第一個域求和,之后計算各個地區所占的百分比;
links_num=2000
awk -v links_num2=$links_num '{per=$1*100/links_num2} {printf("%-10d %4.3f%% %-10s\n",$1,per,$2)}' sort_result.txt|tee sort_resul
t_percent.txt
awk默認的print輸出無法實現格式化;
使用printf進行格式化;
'{per=$1*100/links_num2} {printf("%-10d %4.3f%% %-10s\n",$1,per,$2)}'
per中保存的是百分比
%-10d:任意的格式前都以%開始,-代表左對齊,d代表是數值;左對齊輸出10位寬帶的數值;
%4.3f:4位整數寬帶,小數點后保留3位
%%:表示輸出一個%(第一個%為轉義的意思)
之后有個tab鍵,也會被自動輸出;
%-10s:左對齊輸出10位字符串;
輸出:
223 10.701% 浙江省
207 9.933% 上海市
168 8.061% 廣東省
149 7.150% 山東省
128 6.142% 江蘇省
114 5.470% 雲南省
111 5.326% 四川省
106 5.086% 北京市
84 4.031% 湖北省
82 3.935% 重慶市
71 3.407% 河北省
66 3.167% 福建省
64 3.071% 安徽省
61 2.927% 湖南省
awk 中 printf 使用方法
20121112
printf()函數是格式化輸出函數, 一般用於向標准輸出設備按規定格式輸出信息。在編寫程序時經常會用到此函數。printf()函數的調用格式為:
printf("", );
其中格式化字符串包括兩部分內容: 一部分是正常字符, 這些字符將按原樣輸出; 另一部分是格式化規定字符, 以"%"開始, 后跟一個或幾個規定字符,用來確定輸出內容格式。
參量表是需要輸出的一系列參數, 其個數必須與格式化字符串所說明的輸出參數個數一樣多, 各參數之間用","分開, 且順序一一對應, 否則將會出現意想不到的錯誤。
%d 十進制有符號整數
%u 十進制無符號整數
%f 浮點數
%s 字符串
%c 單個字符
%p 指針的值
%e 指數形式的浮點數
%x, %X 無符號以十六進制表示的整數
%0 無符號以八進制表示的整數
%g 自動選擇合適的表示法
\n 換行
\f 清屏並換頁
\r 回車
\t Tab符
\xhh 表示一個ASCII碼用16進表示,其中hh是1到2個16進制數
說明:
(1). 可以在"%"和字母之間插進數字表示最大場寬。
例如: %3d 表示輸出3位整型數, 不夠3位右對齊。
%9.2f 表示輸出場寬為9的浮點數, 其中小數位為2, 整數位為6,小數點占一位, 不夠9位右對齊。
%8s 表示輸出8個字符的字符串, 不夠8個字符右對齊。
如果字符串的長度、或整型數位數超過說明的場寬, 將按其實際長度輸出.但對浮點數, 若整數部分位數超過了說明的整數位寬度, 將按實際整數位輸出;若小數部分位數超過了說明的小數位寬度, 則按說明的寬度以四舍五入輸出.
另外, 若想在輸出值前加一些0, 就應在場寬項前加個0。
例如: %04d 表示在輸出一個小於4位的數值時, 將在前面補0使其總寬度為4位。
如果用浮點數表示字符或整型量的輸出格式, 小數點后的數字代表最大寬度,小數點前的數字代表最小寬度。
例如: %6.9s 表示顯示一個長度不小於6且不大於9的字符串。若大於9, 則第9個字符以后的內容將被刪除。
(2). 可以在"%"和字母之間加小寫字母l, 表示輸出的是長型數。
例如: %ld 表示輸出long整數
%lf 表示輸出double浮點數
(3). 可以控制輸出左對齊或右對齊, 即在"%"和字母之間加入一個"-" 號可說明輸出為左對齊, 否則為右對齊。
例如: %-7d 表示輸出7位整數左對齊
%-10s 表示輸出10個字符左對齊
例子:
df -h > dffile
more dffile
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 15G 5.1G 8.7G 37% /
none 252M 0 252M 0% /dev/shm
/dev/hda6 31G 12G 18G 40% /home
/dev/hda3 15G 1.7G 13G 13% /usr
/dev/hda2 15G 152M 14G 2% /var
awk '{printf ("%12s\n",$1)}' dffile
Filesystem
/dev/hda1
none
/dev/hda6
/dev/hda3
/dev/hda2
awk '{printf ("%-12s\n",$1)}' dffile
Filesystem
/dev/hda1
none
/dev/hda6
/dev/hda3
/dev/hda2
例子:
echo 1.7 > 2
awk '{printf ("%d\n",$1)} 2
1
awk '{printf ("%f\n",$1)}' 2
1.700000
awk '{printf ("%3.1f\n",$1)}' 2
1.7
awk '{printf ("%4.1f\n",$1)}' 2
1.7
awk '{printf ("%e\n",$1)}' 2
1.700000e+00