2014-10-01 97 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}'