2017-05-09 46 views
0

我想類似這樣的一個文本文件,總結多列:如何求和選擇列?

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

我想在3-5列的底部產生的總和因此它看起來就像:

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

我可以用這個單一的列,但不知道如何指定範圍列:

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

回答

1

最簡單的方法是隻重複相加爲每列,我。

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

在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 

目前for循環會突破每一個數字字段。如果需要更改參數。

+1

謝謝,這真是棒極了。我將printf「%s%s」打印到printf「\ t」「%s%s」以使輸出選項卡被分隔。 –

0

試試這個。請注意,NF僅表示字段的數量。 AWK索引從1開始。所以這裏的例子的範圍是3到最後一個列。

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

如果你想少列,說3和4,然後我會建議:

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

謝謝,我試過,但它只適用於大約一半的列?我嘗試了下面的第三個解決方案,它運行良好。 –

+0

嗨@MeghanRudd,我害怕回答問題多於回答。詹姆斯布朗和我的第一個解決方案是相同的總結所有列(除了第一和第二)。我提供了第二個解決方案,以顯示如何進一步限制列的範圍,這些列只能對第三列和第四列進行求和。無論如何,很高興你在這裏找到了幫助。 – 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