Agregue todas las columnas por separado en Linux si la primera columna tiene las mismas entradas

Agregue todas las columnas por separado en Linux si la primera columna tiene las mismas entradas

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é ja 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.

información relacionada