如何删除FASTA文件中长度不足5的序列及其对应标题行?
解决FASTA文件中删除短序列及其对应标题的问题
问题场景
我有一个FASTA格式的文件,内容如下:
>seq1 GAAAT >seq2 CATCTCGGGA >seq3 GAC >seq4 ATTCCGTGCC
需求是删除所有不以“>”开头且长度小于5的序列行,同时删除其上方对应的标题行。预期输出:
>seq2 CATCTCGGGA >seq4 ATTCCGTGCC
之前尝试用sed -r '/^.{,5}$/d',但这个命令会误删以“>”开头的标题行(比如>seq1长度刚好是5,会被匹配删除),需要正确的处理方法。
解决方案1:用awk处理(推荐,逻辑更清晰)
awk可以很方便地成对处理FASTA的标题行和序列行,命令如下:
awk '/^>/ {hdr=$0; next} length($0)>=5 {print hdr; print}' input.fasta
命令解释:
- 当匹配到以
>开头的标题行时,把该行内容存入变量hdr,然后用next跳过后续处理,直接处理下一行 - 当处理序列行时,判断该行长度是否≥5:
- 如果满足条件,就输出之前保存的标题行
hdr,再输出当前序列行 - 如果不满足,直接跳过不输出
- 如果满足条件,就输出之前保存的标题行
解决方案2:用sed的多行模式处理
如果偏好sed,可以利用其保持空间(hold space)来暂存标题行,命令如下:
sed -n '/^>/{h;};/^.{1,4}$/{d};g;G;p' input.fasta
命令解释:
/^>/{h;}:匹配标题行,将其存入保持空间/^.{1,4}$/{d}:匹配长度≤4的序列行(即小于5的),直接删除g:将保持空间的内容(标题行)覆盖到模式空间G:将当前模式空间的内容(序列行)追加到保持空间内容之后p:输出最终的模式空间内容(标题+符合要求的序列)
内容的提问来源于stack exchange,提问作者Honorato
相关产品推荐
相关产品推荐

