
Tengo este nombre de archivo de salida.txt
AC1481523 001 001 001 001
AC1481523 005 005 005 005
AC1481676 003 003 005 004
AC1481676 003 002 001 004
Quiero agregar todas las columnas por separado donde la primera columna tiene el mismo valor. Probé esto
awk '{for (j = 1; j <= 200; j++) a[$1]+=$j} END {for(i in a) print i,a[i] }' filename.txt
Obtengo todos los números sumados en una sola columna, y obtengo
AC1481523 24
AC1481676 25
Pero yo quiero
AC1481523 6 6 6 6
AC1481676 6 5 6 8
Respuesta1
Aquí hay una forma:
$ 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
Tenga en cuenta que comencé j
a contar desde 2 ya que no queremos el primer campo y hasta NF (el número de campos) en lugar de 200. De esa manera funcionará para un número arbitrario de campos siempre que sea >= 2. Luego , el script utiliza una matriz multidimensional ( a[$1][j]
) de modo que para cada primer campo, hay una matriz de todos los valores asociados. Finalmente, iteramos sobre la matriz e imprimimos según sea necesario.