awkでは、桁数が多い数字(小数点以下を含め、7桁以上)の出力を行うと、デフォルトだと科学表記法(10のべき乗。指数表記とも)で表示されてしまう。
[root@BS-PUB-CENT7-01 ~]# echo "123456789.87654321 94" |awk '{print $1/$2}'
1.31337e+06
これは、awkでは、組み込み変数「OFMT」で返り値の書式を設定できるのだが、そのデフォルトが「%.6g(科学表記か浮動小数点、出力する文字数が少ない方を自動的に選択する)」となっているためだ。
つまり、コマンド実行の際に「OFMT」の設定をし直すか、もしくはprintfやsprintf処理時に書式を別途設定してやればよい。
1.OFMTを指定する
awkで、コマンド実行時にOFMTを別途指定してやる方法。
指定できる値の内容は以下。
- %.6g … 科学表記法か浮動小数点表記法、いずれか文字数が少ない方(デフォルト)
- %.Xe … 科学表記法で出力(Xは桁数)
- %.Xf … 浮動小数点表記法で出力(Xは桁数。小数点以下が桁数以上は四捨五入)
つまり、科学表記法で出力したくないならば、OFMTを「%.Xf」で指定知れやればよい。
[root@BS-PUB-CENT7-01 ~]# echo "123456789.87654321 94" | awk '{print $1/$2}'
1.31337e+06
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # OFMTを「%.6g」に指定
[root@BS-PUB-CENT7-01 ~]# echo "123456789.87654321 94" | awk '{OFMT="%.6g"} {print $1/$2}'
1.31337e+06
[root@BS-PUB-CENT7-01 ~]# echo "1000009550 1021" | awk '{OFMT="%.6g"} {print $1/$2}'
979441
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # OFMTを「%.6e」に指定
[root@BS-PUB-CENT7-01 ~]# echo "123456789.87654321 94" | awk '{OFMT="%.6e"} {print $1/$2}'
1.313370e+06
[root@BS-PUB-CENT7-01 ~]#
[root@BS-PUB-CENT7-01 ~]# # OFMTを「%.6f」に指定
[root@BS-PUB-CENT7-01 ~]# echo "123456789.87654321 94" | awk '{OFMT="%.6f"} {print $1/$2}'
1313370.105070
2.printf(sprintf)実行時に書式を指定する
OFMTと同じ指定方式で、awk内でprintfやsprintf実行時に書式を指定してやることもできる。
OFMTを指定できないような状況ならば、こちらで指定するのもよいだろう。
awk '{printf 書式, 値}' #printfの場合
awk '{$0=sprintf(書式, 値)}1' #sprintfの場合
[root@BS-PUB-CENT7-01 ~]# echo "123456789.87654321 94" | awk '{printf "%.6f\n", $1/$2}'
1313370.105070
[root@BS-PUB-CENT7-01 ~]# echo "123456789.87654321 94" | awk '{$0=sprintf("%.6f\n", $1/$2)}1'
1313370.105070
その他、細かい指定方法についてはこちらを参照するとよいだろう。