LoginSignup
5

More than 5 years have passed since last update.

awkで小数を出力する場合に指数表現になってしまうのを解除する

Posted at

awkでprint文を使って桁数の多い小数を出力すると、デフォルトでは次のように指数表現になってしまいます。

$ echo 1234567.89 | awk '{ print $1*10 }'
1.23457e+07

一度変数に代入してから出力する場合でも同様です。

$ echo 1234567.89 | awk '{ res=$1*10; print res }'
1.23457e+07

awkのprint文は、数値を出力する際の文字列への変換にsprintf関数を利用します。その際にどの形式を使って出力するのかはOFMTという組込変数で定義されていて、これがデフォルトでは"%.6g"となっています。すなわち、小数点以下第6位以上は指数表現の文字列にするということです。

したがって、以下のようにOFMTを"%0.6f"などに変更すれば不動小数点表現になります。OFMTに設定できる値は、sprintfに使う書式制御文字と同様です。

$ echo 1234567.89 | awk '{ OFMT="%.6f" } { res=$1*10; print res }'
12345678.900000
$ echo 1234567.89 | awk '{ res=$1*10; OFMT="%.6f"; print res }'
12345678.900000

ただし、$1のようなフィールド変数に直接値を代入した場合には、この変更が適用されないので注意が必要です。

$ echo 1234567.89 | awk '{ OFMT="%.6f" } { res=$1*10; $1=res; print }'
1.23457e+07

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5