
Olá, preciso obter a soma de cada coluna em um arquivo, preciso ser flexível para quantas colunas houver em qualquer arquivo
atualmente eu uso:
awk '{for (i=1;i<=NF;i++) sum[i]+=$i;}; END{for (i in sum) print sum[i];}'
No entanto, isso me dá apenas a soma da primeira coluna, que obviamente poderia fazer um loop, mas preferiria algo mais simples.
Alguma idéia/resposta?
Responder1
Istofazforneça a soma de cada coluna, mas em uma coluna (desde que os dados sejam separados por espaços em branco):
$ cat data.in
1 2
3 4
5 6
$ awk '{ for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) print sum[i] }' data.in
12
9
Então é uma questão denão gerando uma nova linha entre cada soma.
$ awk '{ for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) printf("%d ", sum[i]); printf("\n") }' data.in
12 9
A printf()
função usa uma string de formato. The %d
é a string de formatação para um inteiro (use %f
para floats), e o espaço a seguir também será gerado após o inteiro. Em seguida, terminamos gerando uma nova linha explícita após o loop.
Outra forma de resolver isso, utilizando a ORS
variável ("Output Record Separator"):
$ awk 'BEGIN { ORS=" " } { for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) print sum[i]; printf("\n") }' data.in
12 9
Veja também o aviso perspicaz de Dave Thompson nos comentários abaixo sobre a ordem das chaves nas matrizes associativas do Awk (que não têm garantia de classificação).
Responder2
perl -lane '$sum[$_] += $F[$_] for 0..$#F; END {print join $", @sum}' data.in