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

问题描述 投票:0回答:3

我的输入:

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 列中的数字行求和,而不是位置列中的数字行。 所需的输出将有一个 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
bash awk
3个回答
1
投票

你已经非常接近了,试试这个:

 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;
}'

1
投票

极简主义脚本可以

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

1
投票

我采用了循环方法,而不是在许多情况下对字段编号进行硬编码。我们跳过第一个字段并取所有剩余字段的总和。

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

如果需要以TAB形式输出,请将

awk
更改为
awk 'BEGIN{OFS="\t"}
(其余代码保持不变)。

© www.soinside.com 2019 - 2024. All rights reserved.