2012-10-13 3 views
4

100 개의 열이있는 배열을 인쇄 중이므로 모든 열에 2 개의 소수를 사용하고 싶습니다. 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 o 숫자를 입력 한 다음 빈 문자열과 연결합니다. 연결하여 문자열로 다시 먼저 0+$0와 숫자로,

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

주 두 변환 :

내가 입력 및 출력 레코드 분리의 재치있는 설정을 사용하는 것이 좋습니다 것 모든 열이를 달성하기 위해 그것과 함께 RT. RT은 일치하는 레코드 분리 기호로 설정됩니다. 이 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, ...))을 사용하여 변환하려는 숫자 만 선택하면 더 좋아질 수 있습니다.

관련 문제