我想在文本文件中对多个列进行求和,类似于:
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
答案 0 :(得分:1)
最简单的方法就是为每一列重复求和,即
awk -F '\t' '{
s3 += $3
s4 += $4
s5 += $5
}
END {
print s3, s4, s5
}' input_file > out
答案 1 :(得分: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
循环遍历每个数字字段。如果需要,可以更改参数。
答案 2 :(得分: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
答案 3 :(得分:0)
试试这个。请注意,NF仅表示字段数。并且AWK索引从1开始。因此这里的示例的范围是3到最后一个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
如果您想要更少的列,例如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