Adicione todas as colunas separadamente no Linux se a primeira coluna tiver as mesmas entradas

Adicione todas as colunas separadamente no Linux se a primeira coluna tiver as mesmas entradas

Eu tenho esta saída filename.txt

AC1481523 001 001 001 001
AC1481523 005 005 005 005
AC1481676 003 003 005 004
AC1481676 003 002 001 004

Quero adicionar todas as colunas separadamente onde a primeira coluna tem o mesmo valor. Eu tentei isso

awk '{for (j = 1; j <= 200; j++) a[$1]+=$j} END {for(i in a) print i,a[i] }' filename.txt

Recebo todos os números somados em uma única coluna e obtenho

AC1481523 24
AC1481676 25

Mas eu quero

AC1481523 6 6 6 6 
AC1481676 6 5 6 8

Responder1

Aqui está uma maneira:

$ awk '{ for (j = 2; j <= NF; j++) a[$1][j]+=$j }
       END {
            for(i in a){
                printf "%s", i; 
                for(field in a[i]){ 
                    printf " %s",a[i][field] 
                } 
                print ""
            }
        }' file 
AC1481676 6 5 6 8
AC1481523 6 6 6 6

Observe que comecei ja contar a partir de 2, pois não queremos o 1º campo e até NF (o número de campos) em vez de 200. Dessa forma funcionará para um número arbitrário de campos, desde que seja >= 2. Então , o script está usando um array multidimensional ( a[$1][j]) para que para cada primeiro campo haja um array de todos os valores associados. Finalmente, iteramos no array, imprimindo conforme necessário.

informação relacionada