Fügen Sie unter Linux alle Spalten einzeln hinzu, wenn die erste Spalte dieselben Einträge enthält

Fügen Sie unter Linux alle Spalten einzeln hinzu, wenn die erste Spalte dieselben Einträge enthält

Ich habe diese Ausgabedateiname.txt

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

Ich möchte alle Spalten einzeln hinzufügen, wobei die erste Spalte den gleichen Wert hat. Ich habe dies versucht

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

Ich bekomme alle Zahlen in einer einzigen Spalte addiert und bekomme

AC1481523 24
AC1481676 25

Aber ich möchte

AC1481523 6 6 6 6 
AC1481676 6 5 6 8

Antwort1

Hier ist eine Möglichkeit:

$ 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

Beachten Sie, dass ich bei 2 angefangen habe jzu zählen, da wir das 1. Feld nicht wollen und bis NF (die Anzahl der Felder) statt 200. Auf diese Weise funktioniert es für eine beliebige Anzahl von Feldern, solange sie >= 2 ist. Dann verwendet das Skript ein mehrdimensionales Array ( a[$1][j]), sodass es für jedes erste Feld ein Array aller zugehörigen Werte gibt. Schließlich iterieren wir über das Array und drucken es nach Bedarf.

verwandte Informationen