使用awk

时间:2018-05-14 11:07:15

标签: awk

我有一个包含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

你知道怎么解决吗?

2 个答案:

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