小数値を合計するには、awk sumに完全な小数が必要です。

小数値を合計するには、awk sumに完全な小数が必要です。

次の test.txt ファイルがあります。

var,value
a,1.1234
b,1.7896749
c,2.4982
d,1.2976232

次のコマンドを使用する場合 -

awk -F ',' '{SUM+=$2}END{print SUM}' test.txt

それは印刷する6.7089

ただし、すべての小数点以下の桁数が保存された結果は次のとおりです。6.7088981 この特定の場合だけでなく、通常、結果のすべての小数点以下の桁数を印刷するようにコマンドを作成するにはどうすればよいですか?たとえば、結果に小数点以下10桁がある場合、小数点以下10桁をすべて印刷する必要がありますか?結果に小数点以下5桁しかない場合は、小数点5桁のみを印刷する必要があります。私が使用するオペレーティングシステムはRed Hat Enterprise Linux Server 7.7です。

ベストアンサー1

OFMTprintf印刷すると、非整数の数値は(デフォルトでは)書式指定を含む特殊変数を使用して10進文字列表現に変換されます%.6g。これを変更して、%.17gIEEE 754二重精度バイナリ浮動小数点数(awkほとんどのシステムでほとんどの実装で内部的に使用されている)の最大精度を得ることができます。他の変数(CONVFMT)は、浮動小数点数が暗黙的に文字列に変換される他の場合(たとえば、数字を他の内容と関連付ける場合)に使用されます。

これらのダブルを使用すると、より高い精度を得ることができず、17以上に上がることは意味がありません。すでに17を使用している場合は、一部の成果物が表示されることがあります。そのような精度が不要な場合は、15個の有効数字がより良い可能性があります。

$ awk -v OFMT=%.17g -F ',' '{SUM+=$2};END{print SUM}' < file
6.7088981000000008
$ awk -v OFMT=%.15g -F ',' '{SUM+=$2};END{print SUM}' < file
6.7088981

印刷されたすべての浮動小数点数に影響しますが、必要な精度で数字を印刷するために直接使用することもOFMTできます。printf

$ awk  -F ',' '{SUM+=$2};END{printf "%.15g\n", SUM}' < file
6.7088981

バージョン4.1.0以降、GNU実装はawk任意の精度算術サポートを介してコンパイルすることができます(参考文献を参照info gawk 'Arbitrary Precision Arithmetic')。システムでこれが発生した場合は、次のこともできます。

gawk -M -v PREC=256 -v OFMT=%.60g -F ',' '{SUM+=$2};END{print SUM}' < file

例:

$ printf 'x,%s\n' 1 1000000000000000000000000000000000.00000000001 |
> gawk -v OFMT=%.15g -F ',' '{SUM+=$2};END{print SUM}'
999999999999999945575230987042816
$ printf 'x,%s\n' 1 1000000000000000000000000000000000.00000000001 |
> gawk -M -v PREC=256 -v OFMT=%.60g -F ',' '{SUM+=$2};END{print SUM}'
1000000000000000000000000000000001.00000000001

ここで別のアプローチは、次を使用することですbc(数字は常に次のように表現されると仮定します(例ではない0.0011e-3)。

<file tail -n+2 | # skip header
  cut -d, -f2   | # extract second field
  paste -sd + - | # join input lines with +
  bc

次の桁は、.すべての入力レコードの最大桁になります。

おすすめ記事