awkで7桁以上の数字を科学表記法(指数表記)で表示させないようにする
Pocket

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
Sponsored Links

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

 

その他、細かい指定方法についてはこちらを参照するとよいだろう。

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。