2012-10-13 65 views
4

我正在打印一個有100列的數組,我希望所有列都有兩位小數。我想使用print $ 0,而不必單獨指定所有列的格式。

OFMT不會看到使用$ 0來的工作:

echo '0.77767686 0.76555555 0.6667667 0.77878878' |awk '{CONVFMT="%.2g";OFMT="%.2g";print ($0+0);print ($0+0)"";print $0}' 

結果:

0.78 
0.78 
0.77767686 0.76555555 0.6667667 0.77878878 
+0

'$ 0'是一個字符串,不是數字!使用'$ 1'..' $ 4'。 – TrueY

回答

4

你爲什麼不使用for循環?

echo '0.77767686 0.76555555 0.6667667 0.77878878' |awk '{ for (i=1; i<=NF; i++) printf "%.2f\n", $i }' 

結果:

0.78 
0.77 
0.67 
0.78 
7

注意,所有的輸入被視爲字符串直到隱含如何使用它進行轉換。當字符串轉換成數字,

OFMT使用例如:

<<< 0.77767686 awk '{ print 0+$0 }' OFMT='%.2g' 

CONVFMT當號碼被轉換成字符串時,例如:在這兩種情況下

<<< 0.77767686 awk '{ print "" 0+$0 }' CONVFMT='%.2g' 

輸出:

0.78 

後者將$0 int一個數字,然後將它與空字符串連接起來。通過連接

<<< '0.77767686 0.76555555 0.6667667 0.77878878' \ 
awk '{ print 0+$0 RT }' CONVFMT='%.2g' RS='[ \t\n]+' ORS='' 

注意的兩次轉換,先用0+$0一個號碼,然後返回一個字符串:

爲了實現這一目標,每列我會建議使用的輸入和輸出的記錄分隔符的合理設置它與RTRT將被設置爲匹配的記錄分隔符。請注意,這是GNU的awk具體而言,作爲一個更便攜的解決方案,使用一個循環,例如:在這兩種情況下

<<< '0.77767686 0.76555555 0.6667667 0.77878878' \ 
awk '{ for (i=1; i<=NF; i++) $i+=0 } 1' CONVFMT='%.2g' 

輸出:

0.78 0.77 0.67 0.78 
1

正如其他人所說,你需要把該領域作爲一個數字來獲得轉換。要結合一些其他的想法,你可以嘗試:

awk '{ for (i=1; i<=NF; i++) $i += 0; print }' 

這將字段轉換爲數字。您可以使用$7 += 0等轉換單個字段。你可以使用if (match($i, ...))和一些正則表達式來選擇你想要轉換的數字。