数値を合計して一意のキーにグループ化しようとしていますが、合計出力は時々指数として表示され、時には丸められた後に整数/浮動小数点として表示されます。
入力ファイル
Id|LegNum|Amount1|Amount2|Location
123456|0|238157.5|4280338.799|CL
123456|1|8487.924693|2541829.5|CL
123456|1|14516.47036|31881.6|CL
123789|0|483773.787|10410.78659|CL
456789|0|1321034|1057203.46|NY
456789|1|65802|4913.79677|NY
567890|0|683651.0865|533.617279|IN
567890|0|705864.844|907210|IN
以下のawkを使用して合計し、最初の列と2番目の列にグループ化します。
awk 'BEGIN { FS = "|"; OFS = FS;} NR==1 {print $1,$2,$3,$4,$5;next}{a[$1"|"$2]+=$3;b[$1"|"$2]+=$4;c[$1"|"$2]=$5;}END{for(i in a)print i,a[i],b[i],c[i]}' InputFile.txt >> output.txt
output.txt は、次のように丸められた合計を指数 OR として表示します。
Id|LegNum|Amount1|Amount2|Location
123789|0|483774|10410.8|CL
123456|0|238158|4.28034e+06|CL
567890|0|1.38952e+06|907744|IN
123456|1|23004.4|2.57371e+06|CL
456789|0|1321034|1.0572e+06|NY
456789|1|65802|4913.8|NY
ただし、数値が浮動小数点の場合は出力が浮動小数点(丸めなし)であることを望み、数値が整数の場合、出力は整数になります。そして間違いなく指数関数的な結果を望んでいません。
答え1
awk
数値を出力するためのデフォルト形式としてその変数を使用しますOFMT
。printf
これが%.6g
デフォルトです。
%f
これをデータに適した類似またはより正確な形式に設定するか、出力形式を明示的に指定するprintf()
代わりに使用できます。print
例:
$ awk 'BEGIN { print 100000000.10, 2, "hello" }'
1e+08 2 hello
$ awk -vOFMT='%f' 'BEGIN { print 100000000.10, 2, "hello" }'
100000000.100000 2 hello
$ awk -vOFMT='%.2f' 'BEGIN { print 100000000.10, 2, "hello" }'
100000000.10 2 hello
$ awk 'BEGIN { printf("%.2f %d %s\n", 100000000.10, 2, "hello") }'
100000000.10 2 hello