awk para somar os números (flutuantes) e agrupá-los em uma chave exclusiva

0

Eu estou tentando somar os números e agrupá-los em uma chave única, mas a saída sum é às vezes mostrada como exponencial e em algum momento ela é mostrada como inteira / flutuante após o arredondamento.

Arquivo de entrada

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

usando abaixo awk para somar e agrupar na primeira e segunda coluna

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 mostra as somas como exponenciais OU após o arredondamento como mencionado abaixo.

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

Mas eu quero a saída como flutuante (sem arredondamento) se o número for flutuante e como inteiro se o número for inteiro. e definitivamente não quer a saída exponencial.

    
por Amit Singh 05.07.2018 / 10:30

1 resposta

2

awk usa sua variável OFMT como o formato printf padrão para a saída de números. Isso é %.6g por padrão.

Você pode configurá-lo para algo como %f ou para um formato mais preciso apropriado para seus dados, ou pode usar printf() em vez de print para formatar a saída explicitamente.

Exemplo:

$ 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
    
por 05.07.2018 / 11:38

Tags