2015-10-30 41 views
1

我對這類工作非常陌生,所以請耐心等待:)我試圖計算超過模式範圍的方法。例如。我有兩個製表符分隔的文件:在模式範圍內計算平均值

文件coverage.txt包含兩個列。第一列表示位置,第二列表示分配給該位置的值。有ca. 4 * 10^6職位。

coverage.txt 
1 10 
2 30 
3 5 
4 10 

第二個文件「patterns.txt」包含三列1.模式的名稱,2.模式的起始位置和模式的結束位置。圖案範圍不重疊。有ca. 3000個模式。

patterns.txt 
rpoB 1 2 
gyrA 3 4 

現在我想計算分配給不同圖案的位置的值的平均值和輸出寫入到含有patterns.txt作爲標識符的第一式柱的新文件。

output.txt 
rpoB 20 
gyrA 7.5 

,我認爲這可以使用awk來完成,但我不知道從哪裏開始。您的幫助將不勝感激!

回答

3

備有四個萬餘位置,它可能是時間達到了較大幅度的編程語言比外殼/ awk的,但是你可以像這樣的東西做一個單通道:

awk '{ 
    if (FILENAME ~ "patterns.txt") { 
    min[$1]=$2 
    max[$1]=$3 
    } else { 
    for (pat in min) { 
     if ($1 >= min[pat] && $1 <= max[pat]) { 
     total[pat] += $2 
     count[pat] += 1 
     } 
    } 
    } 
} 
END { 
    for (pat in total) { 
    print pat,total[pat]/count[pat] 
    } 
}' patterns.txt coverage.txt 

此省略任何覆蓋文件中沒有任何數據的模式;您可以更改END中的循環,以便循環模式文件中的所有內容,而只是輸出0而不顯示那些內容。

+0

謝謝馬克,它工作完美! – gusscat