2014-11-04 55 views
0

問題標題抽取線不完全準確,但我不知道如何句話就那麼請隨時提高的稱號。grep的 - 從一個文件基礎上的模式在另一個文件

我有一個文件具有兩列表示基因對,像這樣:

scign012208 scigt009306 
scign019190 scigt021712 
scign000207 scigt021506 
scign011139 scigt008461 
scign018733 scigt003814 

我有一個包含在一行中的每個基因的表達信息的另一文件中,但以不同的順序比所述對以上:

scign012208 92.2080327275079 134.028976718368 161.049844993173 
scigt021506 271.448068344812 244.144367035135 352.78889225294 
scign011139 0 0 1.22007458328161 
scigt021712 69.3835869760283 70.7270589739666 65.015475611569 
scigt009306 91.2941933895109 159.815950566175 221.69211356076 
scign018733 1.35600048128688 0 0 
scigt021506 271.448068344812 244.144367035135 352.78889225294 
scign019190 1.35600048128688 5.86988219204531 3.66022374984483 

我想提取匹配上述基因名稱線和保持在單獨的行,兩對彼此跟隨,這樣的:

scign012208 92.2080327275079 134.028976718368 161.049844993173 
scigt009306 91.2941933895109 159.815950566175 221.69211356076 
scign019190 1.35600048128688 5.86988219204531 3.66022374984483 
scigt021712 69.3835869760283 70.7270589739666 65.015475611569 

我試着用grep -E並把「|」第一個文件中的兩列之間,但如何保持正確的順序?

+0

你的意思是「正確的順序?你的意思是,從第一個文件中對需要在輸出(即使它們可能不是在輸入順序線)?被整理爲連續線 – 2014-11-04 21:16:24

+0

請出示 – Barmar 2014-11-04 21:17:06

+0

謝謝,我試圖展示想要的結果 – Jon 2014-11-04 21:19:12

回答

1

這其實是相當簡單與xargs

cat file1 | xargs -n 1 -I % grep % file2 

這裏的關鍵是xargs -n 1。它將xargs限制爲一次只讀取一個單詞,而不是逐行讀取文件。

+0

這很美麗。 – Jon 2014-11-05 07:10:39

0

我不明白你的問題,但懷疑這是接近的答案!

awk 'FNR==NR{p[++i]=$1;p[++i]=$2;next} {e[$1]=$0} END{for(j=1;j<=i;j++)print e[p[j]]}' pairs.txt expressions.txt 

好吧,我的文件pairs.txt中讀取並保存在一個數組p[]在那裏的項目,所以p[1]得到scign012208p[2]得到scigt009306

然後,我在文件中expressions.txt讀取並保存在陣列e[]表達,所以e[scign012208]得到scign012208 92.2080327275079 134.028976718368 161.049844993173等。

然後,最後,我按順序通過p[]的元素,並從e[]拿起匹配的東西。

哦,對不起,我剛纔看到我應該用grep做到這一點,你可以做到這一點,我想 - 但它會很慢,如果expressions.txt是一個很大的文件:

while read a b; do grep "$a" expressions.txt; grep "$b" expressions.txt; done < pairs.txt 
相關問題