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

使用Perl与正则表达式拼接FASTA文件中单个样本的多条序列

批量拼接FASTA文件中同样本的目标基因序列

针对你有200+多序列FASTA文件、需要拼接同样本同基因多条序列的需求,我给你准备了两种实用方案,按需选择就行:

方案一:Python + BioPython 脚本(灵活易扩展)

这种方案适合需要自定义处理逻辑的场景,比如后续要加序列质量过滤、拼接分隔符等需求。

步骤1:安装BioPython

先确保你装了BioPython库,没装的话用pip安装:

pip install biopython

步骤2:运行处理脚本

下面的脚本会遍历指定目录下的所有FASTA文件,对每个文件按样本ID分组,把同一样本的所有序列拼接成一条,最后输出到新的文件(比如原文件名加_merged.fasta后缀):

from Bio import SeqIO
import os

# 替换成你的FASTA文件所在目录
input_dir = "./fasta_files"
output_dir = "./merged_fasta_files"

# 创建输出目录(如果不存在)
os.makedirs(output_dir, exist_ok=True)

# 遍历目录下的所有FASTA文件
for filename in os.listdir(input_dir):
    if not filename.endswith(".fasta") and not filename.endswith(".fa"):
        continue
    
    input_path = os.path.join(input_dir, filename)
    output_path = os.path.join(output_dir, f"{os.path.splitext(filename)[0]}_merged.fasta")
    
    # 用字典存储每个样本的拼接序列
    sample_seqs = {}
    
    # 读取FASTA文件
    for record in SeqIO.parse(input_path, "fasta"):
        # 从序列头提取样本ID(这里按下划线分割取第一个字段,比如从"303.1_assembled_PF3D7_1475500..."提取"303.1")
        # 如果你的序列头格式不同,修改这里的分割逻辑即可
        sample_id = record.id.split("_")[0]
        
        # 拼接序列:如果样本已存在,追加新序列;否则初始化
        if sample_id in sample_seqs:
            sample_seqs[sample_id] += str(record.seq)
        else:
            sample_seqs[sample_id] = str(record.seq)
    
    # 将拼接后的序列写入新文件
    with open(output_path, "w") as out_file:
        for sample_id, merged_seq in sample_seqs.items():
            # 新序列头格式可以自定义,这里用样本ID加原基因名(从原文件名提取,你也可以根据需求修改)
            gene_name = os.path.splitext(filename)[0]
            out_file.write(f">{sample_id}_{gene_name}\n{merged_seq}\n")
    
    print(f"处理完成:{filename} -> {os.path.basename(output_path)}")

注意事项

  • 如果你的序列头样本ID提取规则不是“下划线分割第一个字段”,比如需要从其他位置提取,直接修改sample_id = record.id.split("_")[0]这一行即可。
  • 拼接时默认直接追加序列,如果需要在片段之间加分隔符(比如N),可以把sample_seqs[sample_id] += str(record.seq)改成sample_seqs[sample_id] += "N" + str(record.seq)。

方案二:命令行 awk 脚本(适合快速批量处理)

如果你熟悉命令行,这个方案无需安装额外库,直接用awk就能搞定。

单个文件处理命令

假设你的输入文件是input.fasta,运行下面的命令会输出拼接后的序列到output_merged.fasta:

awk '/^>/ {
    split(substr($0,2), arr, "_"); 
    id = arr[1]; 
    if (prev_id != "" && prev_id != id) {
        print seq; 
        seq = ""
    }; 
    prev_id = id; 
    print $0; 
    next
} {
    seq = seq $0
} END {
    print seq
}' input.fasta > output_merged.fasta

批量处理所有FASTA文件

用bash循环批量处理目录下的所有FASTA文件:

for file in ./fasta_files/*.fasta; do
    output_file="./merged_fasta_files/$(basename "$file" .fasta)_merged.fasta"
    awk '/^>/ {
        split(substr($0,2), arr, "_"); 
        id = arr[1]; 
        if (prev_id != "" && prev_id != id) {
            print seq; 
            seq = ""
        }; 
        prev_id = id; 
        print $0; 
        next
    } {
        seq = seq $0
    } END {
        print seq
    }' "$file" > "$output_file"
    echo "处理完成:$file -> $output_file"
done

注意事项

  • 和Python方案一样,样本ID提取依赖序列头的格式,如果你的序列头不是下划线分割第一个字段是样本ID,修改split(substr($0,2), arr, "_"); id = arr[1];这部分逻辑即可。
  • 这个脚本会按序列出现的顺序拼接,确保同一样本的序列连续出现(FASTA文件里同样本的序列通常是排在一起的,如果不是,需要先按样本ID排序,比如用sort -k1,1 input.fasta | awk '...')。

内容的提问来源于stack exchange,提问作者tkh86

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:43:14