我的输入:
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
答案 0 :(得分:1)
请您尝试一下,尝试对许多情况下不可用的字段编号进行硬编码,所以我采用了一种循环方法(在此方法中,我们先跳过第一个字段,然后取所有字段的总和)。 / p>
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"}
与代码相同。
答案 1 :(得分: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;
}'
答案 2 :(得分:1)
一个极简脚本可以是
$ awk '{print $1 "\t" (NR==1?"Sum":$2+$3+$4+$5)}' file