我经常需要在fasta文件中找到特定的序列并打印出来。对于那些不了解的人来说,fasta是生物序列(DNA,蛋白质等)的文本文件格式。它非常简单,你有一行序列名称前面有'>'然后是所有的线,直到下一个'>'是序列本身。例如:
>sequence1
ACTGACTGACTGACTG
>sequence2
ACTGACTGACTGACTG
ACTGACTGACTGACTG
>sequence3
ACTGACTGACTGACTG
我目前获得所需序列的方式是使用grep和-A,所以我会做
grep -A 10 sequence_name filename.fa
然后如果我没有看到文件中下一个序列的开头,我会将10更改为20并重复,直到我确定我得到了整个序列
似乎应该有更好的方法来做到这一点。例如,我可以要求它打印到下一个'>'字符?
答案 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