Summieren Sie die Werte in den anderen Spalten für die 1. Spalte mit derselben ID

Summieren Sie die Werte in den anderen Spalten für die 1. Spalte mit derselben ID

Die Eingabe-TXT-Datei sieht folgendermaßen aus (die eigentliche TXT-Datei enthält mehr Spalten):

target_id   length  eff_length  tot_counts  uniq_counts est_counts  eff_counts
mthl7   61  0   0   0   0   0
loqs    72  0   0   0   0   0
CG45085 58  0   0   0   0   0
CG18317 4978    1430.739479 91  0   30.333333   105.539363
CG18317 4978    1430.739479 91  0   30.333333   105.539363
CG18317 4978    1430.739479 91  0   30.333333   105.539363

für Spalte 1, wenn sie dieselbe ID haben (z. B. CG18317), möchte ich die Werte in den übrigen Spalten addieren. Die Ausgabe würde also folgendermaßen aussehen:

target_id   length  eff_length  tot_counts  uniq_counts est_counts  eff_counts
mthl7   61  0   0   0   0   0
loqs    72  0   0   0   0   0
CG45085 58  0   0   0   0   0
CG18317 14934   4292.218437 273 0   90.999999   316.618089

Ich habe versucht, einen Befehl wie diesen zu verwenden:

awk -F" "
'{a[$1]+=$4;b[$1]+=$5;c[$1]+=$6;d[$1]+=$7;e[$1]+=$8;f[$1]+=$9;g[$1]+=$10;h[$1]+=$11;i[$1]+=$12;j[$1]+=$14;}END{for (i in a) print i" "a[i]" "b[i]" "c[i]" "d[i]" "e[i]" "f[i]" "g[i]" "h[i]" "i[i]" "j[i]}' temp2.txt

Fehlermeldung ist:

awk: can't assign to i; it's an array name.
 input record number 7, file temp2.txt
 source line number 1

Liegt das an der Kopfzeile? Wie überspringe ich die 1. Zeile?

Ich habe versucht, Antworten auf ähnliche Fragen zu finden, die ich hier gefunden habe, aber es hat auch nicht funktioniert.

Antwort1

$ awk 'NR==1{print;next} {for (i=2;i<=NF;i++) {a[$1][i]+=$i}} END{ \
    for (j in a) {s=j; for (i=2;i<=NF;i++) {s=s" "a[j][i]}; print s}}' file
target_id   length  eff_length  tot_counts  uniq_counts est_counts  eff_counts
mthl7 61 0 0 0 0 0
loqs 72 0 0 0 0 0
CG18317 14934 4292.22 273 0 91 316.618
CG45085 58 0 0 0 0 0

Wenn Sie die Zeilen in der gleichen Reihenfolge beibehalten möchten, ist etwas mehr Code erforderlich:

$ awk 'NR==1{print;next} {if ($1 in seen); else b[c++]=$1; seen[$1]=1; \
    for (i=2;i<=NF;i++) {a[$1][i]+=$i}} END{for (j=0;j<c;j++) {s=b[j]; \
    for (i=2;i<=NF;i++){s=s" "a[b[j]][i]}; print s}}' file | column -t
target_id  length  eff_length  tot_counts  uniq_counts  est_counts  eff_counts
mthl7      61      0           0           0            0           0
loqs       72      0           0           0            0           0
CG45085    58      0           0           0            0           0
CG18317    14934   4292.22     273         0            91          316.618

Oben haben wir die Ausgabe auch weitergeleitet, um column -tausgerichtete Spalten zu erhalten.

Befehle im Formular, die zum Kopieren und Einfügen geeignet sind

Die obigen Befehle wurden zur besseren Übersicht auf mehrere Versionen verteilt. Wenn Sie die Befehle kopieren und einfügen möchten, verwenden Sie stattdessen diese Versionen:

awk 'NR==1{print;next} {for (i=2;i<=NF;i++) {a[$1][i]+=$i}} END{ for (j in a) {s=j; for (i=2;i<=NF;i++) {s=s" "a[j][i]}; print s}}' file

Und:

awk 'NR==1{print;next} {if ($1 in seen); else b[c++]=$1; seen[$1]=1; for (i=2;i<=NF;i++) {a[$1][i]+=$i}} END{for (j=0;j<c;j++) {s=b[j]; for (i=2;i<=NF;i++){s=s" "a[b[j]][i]}; print s}}' file | column -t

Nicht-GNUawk

Versuchen:

awk 'NR==1{print;next} {if ($1 in seen); else b[c++]=$1; seen[$1]=1; for (i=2;i<=NF;i++) {a[$1","i]+=$i}} END{for (j=0;j<c;j++) {s=b[j]; for (i=2;i<=NF;i++){s=s" "a[b[j]","i]}; print s}}' file | column -t

verwandte Informationen