2017-05-09 3 views
0

Ich möchte mehrere Spalten in einer Textdatei ähnlich wie dies zusammenzufassen:Wie summiere ich eine Auswahl von Spalten?

GeneA Sample 34 7 8 16 
GeneA Sample 17 7 10 91 
GeneA Sample 42 9 8 11 

Ich möchte die Summe am unteren Rand der Spalten erzeugen 3-5 so wird es wie folgt aussehen:

GeneA Sample 34 7 8 16 
GeneA Sample 17 7 10 91 
GeneA Sample 42 9 8 11 
       93 23 26 

ich kann dies für eine einzelne Spalte verwenden, aber nicht wissen, wie eine Reihe von Spalten angeben:

awk -F'\t' '{sum+=$3} END {print sum}' input file> out 

Antwort

1

der einfachste Weg für jede Spalte nur wiederholen Summieren ist, i.

awk -F '\t' '{ 
    s3 += $3 
    s4 += $4 
    s5 += $5 
} 
END { 
    print s3, s4, s5 
}' input_file > out 
1

In awk:

$ awk ' 
{ 
    for(i=3;i<=NF;i++)      # loop wanted fields 
     s[i]+=$i }       # sum to hash, index on field # 
END { 
    for(i=3;i<=NF;i++)      # same old loop 
     printf "%s%s",s[i],(i==NF?ORS:OFS) } # output 
' file 
93 23 26 118 

Derzeit ist die for Schleife geht durch jedes numerische Feld. Ändern Sie die Parameter bei Bedarf.

+1

Danke, das hat super funktioniert. Ich drucke "% s% s", um "\ t" "% s% s" auszudrucken, um die Ausgabe-Registerkarte zu begrenzen. –

0

Versuchen Sie es. Beachten Sie, dass NF nur die Anzahl der Felder bedeutet. Die AWK-Indizierung beginnt mit 1. Das Beispiel hat also einen Bereich von 3 bis zum letzten col.

awk '{ for(i=3;i<=NF;i++) sum[i] += $i } END { for(i=3;i<=NF;i++) printf("%d ", sum[i]); print "" }' input_file 

Wenn Sie weniger Spalten wollen, sagen 3 und 4, dann würde ich vorschlagen:

awk '{ for(i=3;i<=4 && i<=NF;i++) sum[i] += $i } END { for(i=3;i<=4 && i<=NF;i++) printf("%d ", sum[i]); print "" }' input_file 
+0

Danke, ich habe es versucht, aber es funktionierte nur für etwa die Hälfte der Spalten? Ich habe die dritte Lösung unten versucht und es hat gut funktioniert. –

+0

Hallo @MeghanRudd, Angst, ich habe dich verwirrt, indem ich mehr antwortete als gefragt wurde. James Browns und meine ersten Lösungen sind äquivalent in der Summierung aller Spalten (außer der ersten und zweiten). Ich habe eine zweite Lösung vorgestellt, um zu zeigen, wie Sie den Bereich der Spalten weiter einschränken können, der nur die dritte und vierte Spalte summiert. Wie auch immer, froh, dass du hier Hilfe gefunden hast. – flu

1
$ awk -v OFS='\t' '{s3+=$3; s4+=$4; s5+=$5; $1=$1} 1; 
       END {print "","",s3,s4,s5}' file 

GeneA Sample 34  7  8  16 
GeneA Sample 17  7  10  91 
GeneA Sample 42  9  8  11 
       93  23  26 
Verwandte Themen