如何使用awk从多序列FASTA文件中按指定ID列表提取序列?
从FASTA文件中提取匹配指定ID列表的序列
这里有几种实用方法,覆盖脚本和命令行工具,你可以根据自己的环境和需求挑选:
方法1:用BioPython编写脚本
如果你熟悉Python,这个方法灵活且容易扩展。首先确保已经安装了BioPython:
pip install biopython
假设你的ID列表保存在id_list.txt中(每行一个ID),比如:
7P58X:01332:11636 7P58X:01334:11635
然后创建如下Python脚本extract_seqs.py:
from Bio import SeqIO # 读取ID列表,存入集合提高匹配效率 with open("id_list.txt", "r") as id_file: target_ids = {line.strip() for line in id_file if line.strip()} # 遍历FASTA文件,输出匹配的序列 with open("seq.fasta", "r") as fasta_file, open("extracted_seqs.fasta", "w") as output_file: for record in SeqIO.parse(fasta_file, "fasta"): if record.id in target_ids: SeqIO.write(record, output_file, "fasta")
运行脚本:
python extract_seqs.py
运行后会生成extracted_seqs.fasta,里面就是你要的匹配序列。
方法2:用awk命令行工具
如果不想写脚本,awk是个轻量快速的选择,不需要额外安装依赖。同样假设ID列表在id_list.txt中,直接在终端运行:
awk 'NR==FNR {ids[$1]; next} /^>/ {flag=($1 in ids)} flag' id_list.txt seq.fasta > extracted_seqs.fasta
命令解释:
NR==FNR {ids[$1]; next}:先读取id_list.txt,把每个ID存入数组ids/^>/ {flag=($1 in ids)}:遇到FASTA的标题行(以>开头),检查当前ID是否在ids数组里,设置标记flagflag:如果flag为真,就输出当前行(包括标题和序列行)
方法3:用seqkit工具
seqkit是专门为生物信息学设计的命令行工具,处理FASTA/Q文件非常高效。先安装seqkit(可以通过conda或者官方渠道下载),然后运行:
seqkit grep -f id_list.txt seq.fasta > extracted_seqs.fasta
这个命令非常简洁,-f参数指定ID列表文件,直接输出匹配的序列。
示例输出
如果你的ID列表包含7P58X:01332:11636和7P58X:01334:11635,那么extracted_seqs.fasta的内容会是:
7P58X:01332:11636
TTCAGCAAGCCGAGTCCTGCGTCGTTACTTCGCTT
CAAGTCCCTGTTCGGGCGCC
7P58X:01334:11635
TTCAGCAAGCCGAGTCCTGCGTCGAGAGATCGCTTT
CAAGTCCCTGTTCGGGCGCCACTGCGGGTCTGTGTC
GAGCG
内容的提问来源于stack exchange,提问作者Dalibor Miklík
相关产品推荐
相关产品推荐

