2016-03-25 31 views
0

返回多個結果這是我的問題:的grep -A1 -f比它應該

我有遺傳數據的FASTA文件像這樣(my.fasta):

>TR1|c0_g1_i1 
GTCGAGCATGGTCTTGGTCATCT 
>TR2|c0_g1_i1 
AAGCAGTGCAGAAGAACTGGCGAA... 

我也有一個列表名稱這是my.fasta文件的一個子集,我想拉出序列爲他們(names.list):

TR3|c0_g1_i1 
TR4|c0_g1_i1 

我想是這樣的:

>TR3|c0_g1_i1 
CGGATCATGGTCTTGGTCAAAA 
>TR4|c0_g1_i1 
ATTGGGGGTTTTAAACTGGCGAA... 

我做:grep -A1 -f names.list my.fasta | grep -v "^--$" > new.fasta

但是!我有姓名在我的names.list和當我做時grep -c ">" new.fasta我得到。

我已經grep ">" new.fasta | cut -d' ' -f1 | tr -d '>' > new.names.list 然後cat names.list new.names.list > names.all.listsort names.all.list | uniq -c | grep " 1 " | | sed -r 's/ 1 //' > names.extra.list並結束了額外的514名。他們是如何到達那裏的?!

名稱列表整個my.fasta:http://speedy.sh/kzqKr/names.list

感謝:http://speedy.sh/PQpdD/names.myfasta.list 名稱爲我想要的子集列表!

+0

將文件上傳到某個地方並將其鏈接添加到您的問題中。 – Cyrus

+2

你在'my.fasta'中有沒有像「TR3 | c0_g1_i10」這樣的名字?如果你這樣做了,幾個名字可以用'names.list'中的一個名字來匹配。你可以給一些額外的名字嗎? –

+0

每個名字都是獨一無二的,因爲它們都代表獨特的成績單。由於研究結果未發佈,因此我無法上傳文件。我查了幾個額外的名字,他們不在names.list文件中。 – user261007

回答

0

某些名字包含對方,例如:TR74928|c6_g4_i1TR74928|c6_g4_i10。因此,grep將每行返回多個結果。

要解決這個問題:

sed -e 's/^/>/g' names.list > copy.list

獲得與>前綴的名字,就像在你的文件my.fasta,則:

grep -A1 -x -f copy.list my.fasta | grep -v "^--$" > new.fasta

精確匹配包含您的標識線。

-x,--line-regexp 只選擇那些與整條線完全匹配的匹配項。這個 選項與使用^和$錨定表達式具有相同的效果。

一種更簡單的解決方案是:

grep -A1 -w -f names.list my.fasta | grep -v "^--$" > new.fasta

但這隻會工作,如果在my.fasta沒有標識符線具有多於一個「字」(識別符)。

-w, - word-regexp 僅選擇那些包含形成整個單詞的匹配的行。 測試是匹配的子字符串必須位於行的起始位置 之前,或者在非字組成字符前面。同樣, 它必須位於行尾或後面跟着一個非字 組成字符。字組成字符是字母, 數字和下劃線。