如何汇总选择列?

时间:2017-05-09 17:39:24

标签: awk sum

我想在文本文件中对多个列进行求和,类似于:

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

4 个答案:

答案 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