使用awk将文本文件的内容汇总到另一个文本文件

使用awk将文本文件的内容汇总到另一个文本文件,awk,Awk,我有一个大的文本文件,有两个选项卡分隔的字段。正如您在小示例中看到的,每2行有一个共同的数字。我想用这种方式总结我的文本文件。 1-查找具有相同编号的行,并将这些行的第二列相加 小例子: ENST00000054666.6 2 ENST00000054666.6_2 15 ENST00000054668.5 4 ENST00000054668.5_2 10 ENST00000054950.3 0 ENST00000054950.3_2 4 预期产出: ENST00000054666

我有一个大的文本文件,有两个选项卡分隔的字段。正如您在小示例中看到的,每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列中,每个公共行只有一次重复,没有
“\u 2”
,在第2列中,值是两行的总和(在输入文件中有公共编号)

我尝试了此代码,但没有返回我想要的:

awk -F '\t' '{ col2 = $2, $2=col2; print }' OFS='\t' input.txt > output.txt
您知道如何修复它吗?

解决方案1:以下
awk
可能会对您有所帮助

awk '{sub(/_.*/,"",$1)} {a[$1]+=$NF} END{for(i in a){print i,a[i]}}'   Input_file
解决方案2:如果您的输入文件按第1个字段排序,则以下内容可能会对您有所帮助

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:以下
awk
可能会对您有所帮助

awk '{sub(/_.*/,"",$1)} {a[$1]+=$NF} END{for(i in a){print i,a[i]}}'   Input_file
解决方案2:如果您的输入文件按第1个字段排序,则以下内容可能会对您有所帮助

awk '{sub(/_.*/,"",$1)} prev!=$1 && prev{print prev,val;val=""} {val+=$NF;prev=$1} END{if(val){print prev,val}}'  Input_file

如果您也需要输出文件中的输出,请在上述代码的末尾使用
>output.txt

如果不考虑顺序,下面也可能有帮助:

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

如果订单不是问题,以下内容也可能有帮助:

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

试着选择一个答案(在所有答案中的某个时间之后)作为正确答案,这样线程就可以被视为已完成,继续学习并享受分享知识、干杯。试着选择一个答案(在所有答案中的某个时间之后)作为正确答案,这样线程就可以被视为已完成,继续学习,继续享受分享知识的乐趣,干杯。@JamesBrown谢谢朋友,我忽略了这个事实。@JamesBrown谢谢朋友,我忽略了这个事实。