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 -t
ausgerichtete 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