从fasta文件打印序列

时间:2014-10-01 15:17:04

标签: bash grep fasta

我经常需要在fasta文件中找到特定的序列并打印出来。对于那些不了解的人来说,fasta是生物序列(DNA,蛋白质等)的文本文件格式。它非常简单,你有一行序列名称前面有'>'然后是所有的线,直到下一个'>'是序列本身。例如:

>sequence1
ACTGACTGACTGACTG
>sequence2
ACTGACTGACTGACTG
ACTGACTGACTGACTG
>sequence3
ACTGACTGACTGACTG

我目前获得所需序列的方式是使用grep和-A,所以我会做

grep -A 10 sequence_name filename.fa

然后如果我没有看到文件中下一个序列的开头,我会将10更改为20并重复,直到我确定我得到了整个序列

似乎应该有更好的方法来做到这一点。例如,我可以要求它打印到下一个'>'字符?

4 个答案:

答案 0 :(得分:7)

使用>作为记录分隔符:

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

答案 1 :(得分:2)

喜欢这样:

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

因此,如果该行以>sequence1开头,请设置一个标志(p)以开始打印,打印此行并移至下一行。在后续行中,如果行以>开头,请更改p标志以停止打印。通常,如果设置了标志p,则打印。

或者,在grep解决方案上略微改进一下,使用它来切断-A (after)上下文:

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

因此,在sequence1之后打印最多999999行,并将它们输入awk。然后,Awk在第1行之后的任何行的开头查找>,如果找到则退出。在此之前,1会导致awk执行标准操作,即打印当前行。

答案 2 :(得分:1)

仅使用sed

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

答案 3 :(得分:0)

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