2015-12-19 92 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