2015-05-06 24 views
2

分組這個問題確實很難用一句話來形容,所以原諒我,如果標題沒有抓住什麼,我下面寫..以列的值在一個文件中的平均值,由一個因素,另一個文件AWK

我有兩個文件,第一個文件(FILE1.TXT)包含:

Chr1 1 0 
Chr1 2 0 
Chr1 3 3 
Chr1 4 0 
Chr1 5 5 
Chr1 6 0 
Chr1 7 0 
Chr1 8 0 
Chr1 9 0 
Chr1 10 7 
Chr1 11 0 
Chr1 12 0 
Chr1 13 0 
Chr1 14 9 
Chr1 15 0 
Chr1 16 0 
Chr1 17 0 
Chr1 18 0 
Chr1 19 0 
Chr1 20 0 
Chr2 1 0 
Chr2 2 0 
Chr2 3 0 
Chr2 4 9 
Chr2 5 10 
Chr2 6 1 
Chr2 7 0 
Chr2 8 0 
Chr2 9 0 
Chr2 10 0 

CHR1和CHR2代表染色體(列1)和列2包含在染色體上的位置。請注意如何人數總是從1開始,然後上升到一個更大的數字,但未知號碼(CHR 1,它在20結束)。第三列包含在該染色體位置對應的計。

FILE2.TXT看起來是這樣的:

Chr1 1 10 
Chr1 5 15 
Chr1 10 20 
Chr1 15 25 
Chr5 1 10 

它指定了10個職位分開(將在有序的窗口:起始位置增量爲5上升,但窗口大小爲10 )。


我需要平均每個窗口內的計數。

爲CHR1位置1到位置CHR1的窗口10 結合了計0 + 0 + 3 + 0 + 5 + 0 + 0 + 0 + 0 + 7 = 15 所以平均是15/10(大小窗口)= 1.5

窗口爲CHR1位置5至CHR1位置15 已經5 + 0 + 0 + 0 + 0 + 7 + 0 + 0 + 0 + 9 + 0 = 21 所以平均合併計數是21/11(窗口的大小)= 1.909

Chr1位置10到Chr1位置20 的窗口的組合計數爲7 + 0 + 0 + 0 + 9 + 0 + 0 + 0 + 0 + 0 + 0 = 16 因此平均值爲16/11(窗口的大小)= 1.454

窗口爲CHR1位置15至CHR1位置25(最後5個位置在範圍之外) 結合了計0 + 0 + 0 + 0 + 0 + 0 = 0 所以平均是0

爲CHR5位置1到位置CHR5 10(FILE1.TXT沒有記錄)的窗口 所以平均是0

輸出應爲:

Chr1 1 10 1.5 
Chr1 5 15 1.909 
Chr1 10 20 1.454 
Chr1 15 25 0 
Chr5 1 10 0 

注意CHR2怎麼不在輸出文件,因爲文件2有沒有爲CHR2指定的任何窗口..

我編碼在Perl的東西來解決這個問題,但是,它是由於相當緩慢file1.txt的大尺寸。是用awk這個問題有解?我希望它可以提供更快(和更短)的解決方案..我想這個解決方案將涉及一個關聯數組,但迄今爲止我已經想出瞭如何加入到第一列和第二列,這甚至不能解決問題..

awk 'FNR==NR{a[$1,$2]=$3;next}{ print a[$1,$2]}' file1.txt file2.txt 

或者這個問題不適合awk嗎?

回答

1

你加載從第一個文件中的數據到數組正確。然後,當您讀取第二個文件時,您需要遍歷範圍所選的值,計算平均值。

awk 'FNR==NR{a[$1,$2]=$3;next} 
    { total = 0; 
     for(i = $2; i <= $3; i++) total += a[$1,i]; 
     print $1, $2, $3, total/($3-$1+1); 
    }' file1.txt file2.txt 
+0

謝謝,這看起來不錯。除了我認爲它應該是總數/($ 3- $ 2 + 1)? – SonicProtein

相關問題