2017-05-11 9 views
0

我有兩個文件,我想重疊一些範圍,並根據完全匹配和部分匹配檢索結果。一個例子會說清楚。R,awk,sed:合併bin和輸出中央重疊,然後中央+相鄰重疊

的fileA:

chr1 200  400  E1 
chr1 400  600  E2 
chr1 600  800  E3 
chr2 200  300  E4 

FILEB:

chr1 100  250 TF1 G1 
chr1 250  650 TF2 G2 
chr1 450  850 TF3 G3 

輸出:

chr1 100 250 TF1 G1 chr1 200  400  E1 
chr1 250 650 TF2 G2 chr1 200  400  E1 
chr1 250 650 TF2 G2 chr1 400  600  E2 
chr1 250 650 TF2 G2 chr1 600  800  E3 
chr1 450 850 TF3 G3 chr1 400  600  E2 
chr1 450 850 TF3 G3 chr1 600  800  E3 

Uptil這一步我可以做的事情,但接下來的步驟是,我需要你的幫助。

在這裏,我想第一子集是僅具有(例如輸出文件的第1行,不考慮到該重疊尺寸)1個匹配的那些行

  1. 如果有兩個匹配(例如,5行和6個輸出),那麼具有最多重疊的'中央行'(與重疊爲150的行5相比,重疊爲第6行)
  2. 如果存在3個或多於3個匹配(例如,第3行輸出完全重疊,但第2行和第4行是相鄰行,分別有部分重疊,分別爲150和50),那麼我只想返回在這種情況下,中央行將是行3。

後來,我想要檢索的第一鄰居,然後第二neigbors等,因爲在實際工作中的數據集是可能發生的文件B中一個二進制位將在文件A.

最大的5個或7箱重疊

所以,基本上我想要的是首先得到所有的中央重疊,然後中央+第一個鄰居,然後中央+第二個鄰居,等等。

按照此理,我的第一個結果將是:

結果1(中央重疊):

chr1 100 250 TF1 G1 chr1 200  400  E1 
chr1 250 650 TF2 G2 chr1 400  600  E2 
chr1 450 850 TF3 G3 chr1 600  800  E3 

結果2(中央+ 1的鄰居):

chr1 100 250 TF1 G1 chr1 200  400  E1 
chr1 250 650 TF2 G2 chr1 200  400  E1 
chr1 250 650 TF2 G2 chr1 400  600  E2 
chr1 250 650 TF2 G2 chr1 600  800  E3 
chr1 450 850 TF3 G3 chr1 400  600  E2 
chr1 450 850 TF3 G3 chr1 600  800  E3 

如果可能的話,我想單獨檢索相鄰的行,而不是中心的行。

任何幫助將不勝感激。謝謝。

回答

1

這不是完整的解決方案,因爲我無法理解我的時間預算的額外要求,但也許這會讓你開始。

假設文件是​​由第一個鍵排序...

join fileB fileA | 
awk '{diff=($3<$7?$3:$7)-($2>$6?$2:$6)} diff>0{print $0, diff}' | 
sort -k1,1 -k9nr | 
awk '!a[$1,$2,$3]++' 

chr1 250 650 TF2 G2 400 600 E2 200 
chr1 450 850 TF3 G3 600 800 E3 200 
chr1 100 250 TF1 G1 200 400 E1 50 

最後一欄顯示的重疊量,或許將成爲下一個步驟也是有用的。

UPDATE

與上次awk的稍微修改就可以得到第二和第三鄰國以及

$ join fileB fileA | ...| awk '!(a[$1,$2,$3]++-1)' 
chr1 250 650 TF2 G2 200 400 E1 150 
chr1 450 850 TF3 G3 400 600 E2 150 

$ join fileB fileA | ... | awk '!(a[$1,$2,$3]++-2)' 
chr1 250 650 TF2 G2 600 800 E3 50 
在輸出

你有chr1 250 650上市三次,也許這是一個錯字或我完全誤解你在這裏試圖做什麼...

或者,你可以標記記錄上的順序,並做過濾ba sed在那。

$ join fileB fileA | ... | awk '{print a[$1,$2,$3]++, $0}' | sort -k1n 

0 chr1 100 250 TF1 G1 200 400 E1 50 
0 chr1 250 650 TF2 G2 400 600 E2 200 
0 chr1 450 850 TF3 G3 600 800 E3 200 
1 chr1 250 650 TF2 G2 200 400 E1 150 
1 chr1 450 850 TF3 G3 400 600 E2 150 
2 chr1 250 650 TF2 G2 600 800 E3 50 

這裏第一列表示鄰居號碼,其中0是中心。

拉在一起,您可以提取所需的字段到單獨的文件

join fileB fileA       | 
awk ' {diff=($3<$7?$3:$7)-($2>$6?$2:$6)} 
    diff>0 {print $0,diff}'     | 
sort -k1,1 -k9nr       | 
awk '{print a[$1,$2,$3]++, $0}'    | 
sort -k1n         | 
awk '{file=($1==0)?"central":"neighbor"$1; 
     print $2,$3,$4,$5,$6,$7,$8,$9 > file}' 

創建這些文件。

==> central <== 
chr1 100 250 TF1 G1 200 400 E1 
chr1 250 650 TF2 G2 400 600 E2 
chr1 450 850 TF3 G3 600 800 E3 

==> neighbor1 <== 
chr1 250 650 TF2 G2 200 400 E1 
chr1 450 850 TF3 G3 400 600 E2 

==> neighbor2 <== 
chr1 250 650 TF2 G2 600 800 E3 

需要注意的是,所有這一切都可以在一個awk腳本(如果需要的話和更新)以這種形式進行組合,但我認爲這是比較容易理解。

+0

非常感謝@karakfa抽出時間幫助我。 – Newbie

+0

不客氣。向前付款... – karakfa