我有一个包含2个制表符分隔字段的大文本文件。正如您在小例子中看到的那样,每2行有一个共同的数字。我想以这种方式总结我的文本文件。 1-查找具有相同数字的行,并总结这些行的第二列。
小例子:
ENST00000054666.6 2
ENST00000054666.6_2 15
ENST00000054668.5 4
ENST00000054668.5_2 10
ENST00000054950.3 0
ENST00000054950.3_2 4
预期产出:
ENST00000054666.6 17
ENST00000054668.5 14
ENST00000054950.3 4
正如您所看到的那样,两个列都存在差异。在第1列中,每个公共列只有一个重复,没有"_2"
,在第2列中,值是两行的总和(在输入文件中有共同的数字)。
我尝试了这段代码,但没有返回我想要的内容:
awk -F '\t' '{ col2 = $2, $2=col2; print }' OFS='\t' input.txt > output.txt
你知道怎么解决吗?
答案 0 :(得分:3)
解决方案第一: 关注awk
可能对您有帮助。
awk '{sub(/_.*/,"",$1)} {a[$1]+=$NF} END{for(i in a){print i,a[i]}}' Input_file
解决方案第二: 如果您的Input_file按第一个字段排序,那么以下内容可能对您有帮助。
awk '{sub(/_.*/,"",$1)} prev!=$1 && prev{print prev,val;val=""} {val+=$NF;prev=$1} END{if(val){print prev,val}}' Input_file
如果您还需要输出文件中的输出,请在上述代码的末尾使用> output.txt
。
答案 1 :(得分:3)
如果订单不是问题,下面也可能有所帮助:
awk -v FS="\t|_" '{count[$1]+=$NF}
END{for(i in count){printf "%s\t%s%s",i,count[i],ORS;}}' file
ENST00000054668.5 14
ENST00000054950.3 4
ENST00000054666.6 17
修改: 如果输出的顺序很重要,那么使用标志的方法有助于:
$ awk -v FS="\t|_" '{count[$1]+=$NF;++i;
if(i==2){printf "%s\t%s%s",$1,count[$1],ORS;i=0}}' file
ENST00000054666.6 17
ENST00000054668.5 14
ENST00000054950.3 4