A soma de cada coluna em um arquivo precisa ser flexível para quantas colunas houver no arquivo

A soma de cada coluna em um arquivo precisa ser flexível para quantas colunas houver no arquivo

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 %fpara 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 ORSvariá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

informação relacionada