숫자를 합산하여 고유 키로 그룹화하려고 하는데 합계 출력이 때때로 지수로 표시되고 때로는 반올림 후 정수/부동 소수점으로 표시됩니다.
입력 파일
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