2015-12-19 63 views
1

组合输出我有一个在下面的格式使用awk创建的文件:通过现场用awk

文件

chr2:46603668-46603902 EPAS1-902|gc=54.3 234 bases with an average of 253.1 
chr2:211471445-211471675 CPS1-1205|gc=48.3 230 bases with an average of 264.7 
chr19:15291762-15291983 NOTCH3-1003|gc=68.8 221 bases with an average of 195.8 
chr2:211460199-211460318 CPS1-1200|gc=41.2 119 bases with an average of 105.6 

我所试图做的是结合匹配所有$2一排接一排地脱掉-。文件中的每一行都会有一个匹配项,尽管这些在示例中没有显示。谢谢 :)。

所需的输出

chr2:211471445-211471675 CPS1|gc=48.3 230 bases with an average of 264.7 
chr2:211460199-211460318 CPS1|gc=41.2 119 bases with an average of 105.6 
chr2:46603668-46603902 EPAS1-902|gc=54.3 234 bases with an average of 253.1 
chr19:15291762-15291983 NOTCH3-1003|gc=68.8 221 bases with an average of 195.8 

我想:

AWK

awk '{k=$1 FS $2; a[k]+=split[$2] "-"; c[k]++} 
END{for(k in a) 
     {split(k,ks,FS); 
     print ks[1],c[k],ks[2],a[k]/c[k]}}' file > output.txt 
+0

如果“每一行都有匹配”,为什么不直接在第二个字段中去掉“ - [digits]”。 –

回答

2

如果除了awk使用sort是一种选择,你可能会想尝试:

sort -k2,2 file | awk '{sub(/-[0-9]+/,"",$2);print $0}' 

-k2,2是指定第二列。在这种情况下的输出是:

chr2:211460199-211460318 CPS1|gc=41.2 119 bases with an average of 105.6 
chr2:211471445-211471675 CPS1|gc=48.3 230 bases with an average of 264.7 
chr2:46603668-46603902 EPAS1|gc=54.3 234 bases with an average of 253.1 
chr19:15291762-15291983 NOTCH3|gc=68.8 221 bases with an average of 195.8 

注意,我剥夺 - 在第二场尾号“”。在您所需的输出中,您为CPS1值执行了此操作,但不是其他值。我在这里错过了什么?如果只想-删除,由/-/

取代/-[0-9]+/如果你不想或者不能使用sort,你可以考虑gawk。与awk相反,gawk具有用于对数组进行排序的内置函数(asortasorti)。在这种情况下,您的GAWK命令:

gawk '{sub(/-[0-9]+/,"",$2); ar[$2]=$0} 
      END{n = asort(ar) 
       for (i = 1; i <= n; i++) 
        print ar[i]}' file 

输出:

chr19:15291762-15291983 NOTCH3|gc=68.8 221 bases with an average of 195.8 
chr2:211460199-211460318 CPS1|gc=41.2 119 bases with an average of 105.6 
chr2:211471445-211471675 CPS1|gc=48.3 230 bases with an average of 264.7 
chr2:46603668-46603902 EPAS1|gc=54.3 234 bases with an average of 253.1 

还是想用awk,只有在awk?在这种情况下,你必须实现你自己的排序功能。阅读here如何做到这一点。

感谢mklement0提供了关于使用sort的-k选项和awk的-F选项的一些建议。

+0

非常感谢你对这个非常有帮助的文章:)。 – Chris