
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 j
a 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.