2017-04-09 33 views
0

一般問題: 我正在嘗試使用索引查找基於參考表的名稱。我的文檔和參考表中的第一列的值需要匹配,但後來我想檢查我的文件中的數值,在我的參考表中的兩個數值列之間下降。如果是這樣,我想從參考表中打印相應的名稱到我的文件中的新列。否則,我想打印「NA」多列查找

具體例子 我想匹配我的文件和參考表的第一列(CHR),看看它們是否匹配。如果是這樣,我想看看在文件(POS)的第2列的值大於所述基準(開始)的3列,但小於基準(完)的4列中。如果是這樣,我想從參考表中添加相應的col 4(Gene_name)到我的文件的新的第4列。如果沒有相應的基因,我想把「NA」放在我的文件的基因名稱列中。

文件

Chr pos  p-val 
2L 1885826 2.638e-08 
2L 1996567 5.12e-05 
2L 2360597 9.472e-05 
2R 2360621 9.472e-05 
2R 2360623 9.472e-05 

參考

Chr Start End  Gene_name 
2L 1884260 1888828 FBgn0262029 
2L 19531851 19547482 FBgn0052532 
2L 2350523 2361570 FBgn0023536 
2L 4647871 4648646 FBgn0029718 

所需的輸出

Chr pos  p-val  Gene_name 
2L 1885826 2.638e-08 FBgn0262029 
2L 1996567 5.12e-05 NA 
2L 2360597 9.472e-05 FBgn0023536 
2R 2360621 9.472e-05 NA 
2R 2360623 9.472e-05 NA 

嘗試

我一直在試圖從這個問題調整代碼來做到這一點。 awk Lookup 2 files, print match and Sum of Sencond Field:

到目前爲止,我有這樣的:

awk -F"\t" '          #Set Field separator to  "\t" 
FNR==NR {a[$1];a[$2];a[$3];next}     #Read data from Reference using field #1, field #2, field #3 as index in to array a 
{if ($1 in a)        #Test if field #1 in Table is found in a 
{if ($2 > a[$2]) 
{if ($2 < a[$3]) 
print $0, a[$4]      #If found, print line of f1.txt with sum and index from array 
else print $0,"NA"  #If not found print line of f1.txt with NotFound 
} 
else print $0,"NA"  #If not found print line of f1.txt with NotFound 
} 
else print $0,"NA"  #If not found print line of f1.txt with NotFound 
} 
' OFS="\t" Referance.txt File.txt      #Set Output field separator to , and read files 

產生

2L 1885826 2.638e-08 NA 
2L 1996567 5.12e-05 NA 
2L 2360597 9.472e-05 NA 
2R 2360621 9.472e-05 NA 
2R 2360623 9.472e-05 NA 

我想我在嵌套if else語句犯了一個錯誤的地方,但我不知道是什麼我做錯了。將不勝感激任何建議!

回答

1

awk來救援!

awk  '{k=$1} 
    NR==FNR {c[k]++; start[k,c[k]]=$2; end[k,c[k]]=$3; gene[k,c[k]]=$4; next} 
      {$(NF+1)=FNR==1?"Gene_name":"NA"} 
    k in c {for(i=1;i<=c[k];i++) 
       if(start[k,i]<=$2 && $2<=end[k,i]) 
        {$NF=gene[k,i]; 
        break}}1' file2 file1 | column -t 


Chr pos  p-val  Gene_name 
2L 1885826 2.638e-08 FBgn0262029 
2L 1996567 5.12e-05 NA 
2L 2360597 9.472e-05 FBgn0023536 
2R 2360621 9.472e-05 NA 
2R 2360623 9.472e-05 NA 

一些說法:假設第二個文件適合內存,範圍不重疊(如果是的話,只報告第一個匹配項)。是否線性掃描,如果兩個文件較大,因此可能是緩慢的,更好的算法可以與排序的區間開始(也將驗證他們是否重疊或沒有)。

代碼應該很容易閱讀,基本上是加載了完整的文件2成多個陣列和檢查的第一個文件的條目匹配範圍。