如何在FASTA文件中实现序列头的条件式字符串替换?
批量替换FASTA序列头:按物种关键词重命名
问题场景
我有一个大型FASTA文件,序列头包含多级分类的细菌物种名称,示例输入如下:
# file.fasta >Bacteria;Actinobacteria;Actinobacteria;Streptomyces;Streptomycetaceae;Streptomyces;Streptomyces_sp._AA4; TTGGCAGTCTCTCCCGCGAACCAGGCCACTGCTGCGACCACCTCGGCTGAATCCCGCGCGCAGGCCACGGGAATCCCCGG >Bacteria;Actinobacteria;Actinobacteria;Pseudonocardiales;Pseudonocardiaceae;Amycolatopsis;Amycolatopsis_niigatensis; TTGGCAGTCTCTCCCGCGAACCAGGCCACTGCTGCGACCACCTCGGCTGAATCCCGCGCGCAGGCCACGGGAATCCCCGG
需要实现的效果:遍历每个序列头,若包含Streptomyces则替换为>Streptomyces,否则替换为>Not Streptomyces,处理后输出如下:
# new_file.fasta >Streptomyces TTGGCAGTCTCTCCCGCGAACCAGGCCACTGCTGCGACCACCTCGGCTGAATCCCGCGCGCAGGCCACGGGAATCCCCGG >Not Streptomyces TTGGCAGTCTCTCCCGCGAACCAGGCCACTGCTGCGACCACCTCGGCTGAATCCCGCGCGCAGGCCACGGGAATCCCCGG
之前尝试用awk/sed但不知如何替换整个序列头,求可行方案。
解决方案
方法1:用awk实现(推荐,处理大文件更高效)
awk逻辑清晰,天然适合按行处理文本任务:
awk '/^>/ { if($0 ~ /Streptomyces/) print ">Streptomyces"; else print ">Not Streptomyces"; next } 1' file.fasta > new_file.fasta
代码说明:
/^>/:匹配以>开头的序列头行if($0 ~ /Streptomyces/):判断当前行是否包含目标物种关键词- 匹配成功输出指定头,否则输出另一个头
next:跳过后续处理,直接进入下一行1:对非序列头的序列内容行,直接原样输出
方法2:用sed实现
sed通过分支命令处理条件匹配,适合习惯sed语法的用户:
sed -e '/^>/ { /Streptomyces/c\>Streptomyces' -e 't' -e 'c\>Not Streptomyces' -e '}' file.fasta > new_file.fasta
代码说明:
/^>/ { ... }:仅对序列头行执行花括号内操作/Streptomyces/c\>Streptomyces:匹配关键词时替换为指定头t:替换成功后直接跳至下一行,不执行后续命令c\>Not Streptomyces:未匹配关键词时替换为对应头
内容的提问来源于stack exchange,提问作者harpers29
相关产品推荐
相关产品推荐

