A soma de cada coluna em um arquivo precisa ser flexível para o mesmo número de colunas que o arquivo

0

Oi eu preciso para obter a soma de cada coluna em um arquivo, precisa ser flexível para tantas colunas como em qualquer arquivo fornecido

atualmente eu uso:

awk '{for (i=1;i<=NF;i++) sum[i]+=$i;}; END{for (i in sum) print sum[i];}'

Isso, no entanto, só me dá a soma da primeira coluna, que eu poderia obviamente dar um loop, mas eu preferiria algo mais simples.

Alguma ideia / resposta?

    
por Giles 25.04.2017 / 22:14

2 respostas

2

Ele faz dar a soma de cada coluna, mas em uma coluna (desde que os dados sejam separados por espaços):

$ 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 de não gerar 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 função printf() usa uma string de formato. O %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 com a saída de uma nova linha explícita após o loop.

Outra maneira de resolvê-lo, usando a variável ORS ("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 alerta perspicaz de Dave Thompson nos comentários abaixo sobre a ordenação de chaves nos arrays associativos do Awk (que não têm garantia de serem classificados).

    
por 25.04.2017 / 22:22
0
perl -lane '$sum[$_] += $F[$_] for 0..$#F; END {print join $", @sum}' data.in
    
por 26.04.2017 / 08:38