繁体   English   中英

如何使用awk对tsv文件中的行求和?

[英]How to sum rows in a tsv file using awk?

我的输入:

Position   A   B   C   D   No
1   0   0   0   0   0
2   1   0   1   0   0
3   0   6   0   0   0
4   0   0   0   0   0
5   0   5   0   0   0

我有一个如上所述的TSV文件,在这里我只希望对ABCD列中的数字行求和,而不是对Position列中的数字行求和。 期望的输出将具有TSV,第一列为两行,位置和总和,

Position   Sum
1    0
2    2
3    6
4    0
5    5

到目前为止,我有:

awk 'BEGIN{print"Position\tSum"}{if(NR==1)next; sum=$2+$3+$4+$5 printf"%d\t%d\n",$sum}' infile.tsv > outfile.tsv

您能不能尝试遵循以下方法,即您试图对字段号进行硬编码,这在许多情况下不起作用,因此我采用了循环方法(在此方法中,我们将跳过第一个字段,然后取所有字段的总和)。

awk 'FNR==1{print $1,"sum";next} {for(i=2;i<NF;i++){sum+=$i};print $1,sum;sum=""}' Input_file

更改awkawk 'BEGIN{OFS="\\t"}其余部分相同的代码,如果你需要输出TAB形式。

您距离很近,请尝试以下操作:

 awk 'BEGIN{print"Position\tSum"}{if(NR==1)next; sum=$2+$3+$4+$5; printf "%d\t%d\n",$1,sum; }' infile.tsv > outfile.tsv

但是我说用换行符和空格会更干净:

awk '
BEGIN { 
    print"Position\tSum";
}
{  
    if (NR==1) {
        next; 
    }
    sum = $2 + $3 + $4 + $5 + $6; 
    printf "%d\t%d\n", $1, sum;
}'

极简脚本可以是

$ awk '{print $1 "\t" (NR==1?"Sum":$2+$3+$4+$5)}' file

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM