使用awk将文本文件的内容汇总到另一个文本文件
我有一个大的文本文件,有两个选项卡分隔的字段。正如您在小示例中看到的,每2行有一个共同的数字。我想用这种方式总结我的文本文件。 1-查找具有相同编号的行,并将这些行的第二列相加 小例子:使用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
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谢谢朋友,我忽略了这个事实。