我试图对数字进行求和并将其分组到一个唯一的键上,但总和输出有时显示为指数,有时在四舍五入后显示为整数/浮点数。
输入文件
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 将其求和并分组到第一列和第二列
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