使用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
相关产品推荐
相关产品推荐

