2014-10-01 91 views
2

我經常需要在fasta文件中查找特定的序列並將其打印出來。對於那些不知道的人,fasta是生物序列(DNA,蛋白質等)的文本文件格式。這很簡單,你有一個序列名前面有一個'>'的行,然後直到下一個'>'後面的所有行都是序列本身。例如:從fasta文件打印序列

>sequence1 
ACTGACTGACTGACTG 
>sequence2 
ACTGACTGACTGACTG 
ACTGACTGACTGACTG 
>sequence3 
ACTGACTGACTGACTG 

目前我得到我所需要的序列的方法是使用grep有-A的,所以我會做

grep -A 10 sequence_name filename.fa 

,然後,如果我沒有看到文件中下一個序列的開始,我將把10改爲20並重復,直到我確定我已經完成了整個序列。

看起來應該有更好的方法來做到這一點。例如,我可以讓它打印到下一個'>'字符嗎?

回答

5

使用>作爲記錄分隔符:

awk -v seq="sequence2" -v RS='>' '$1 == seq {print RS $0}' file 
>sequence2 
ACTGACTGACTGACTG 
ACTGACTGACTGACTG 
+0

+1尼斯。我假設你知道如果你在腳本之後但在文件之前加上'RS ='>'',你就可以爲自己節省'-v' ... – 2014-10-01 15:46:43

+0

我這樣做,但我喜歡將變量保持在前,文件在結束(非常像BEGIN塊可以出現在腳本的任何位置,但通常在開始時看到)。 – 2014-10-01 15:47:27

2

喜歡這也許:

awk '/>sequence1/{p++;print;next} /^>/{p=0} p' file 

因此,如果符合>sequence1開始,設置一個標誌(p)開始打印,打印該行並移動到下一個。在後續行上,如果行以>開頭,請更改p標誌以停止打印。一般來說,打印如果標誌p已設置。所以

grep -A 999999 "sequence1" file | awk 'NR>1 && /^>/{exit} 1' 

,最多可打印sequence1後999999條線路和管道他們到awk

或者提高一點上你grep的解決方案,以此來切斷-A (after)上下文。 Awk然後在第1行之後的任何行的開始處查找>,如果找到一行,則退出。在此之前,1導致awk做它的標準事情,這是打印當前行。

0
$ perl -0076 -lane 'print join("\n",@F) if $F[0]=~/sequence2/' file 
1

使用sed只:

sed -n '/>sequence3/,/>/ p' | sed '${/>/d}'