You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 12:25:16