如何从FASTA文件中提取指定ID的唯一序列?
解决FASTA序列提取时的重复问题
你遇到的重复问题,本质是因为目标FASTA文件里存在相同ID的重复序列条目,而seqkit grep和seqtk subseq默认会提取所有匹配到的条目,不会自动去重。下面针对两个工具分别给出修改方案:
方案1:使用seqkit(推荐,操作更简洁)
seqkit自带专门的去重工具,可以在提取完成后按序列ID去重,默认保留每个ID的第一次出现:
seqkit grep -f in.txt in.fa | seqkit rmdup -n > out.fa
seqkit grep -f in.txt in.fa:从FASTA文件中提取TXT列表里指定ID的序列seqkit rmdup -n:按序列ID(名称)去重,只保留每个ID第一次出现的条目
如果你的TXT列表本身也存在重复ID,可以先给列表去重再提取,进一步优化:
# 将空格分隔的ID转为每行一个,再去重 tr ' ' '\n' < in.txt | sort -u > unique_ids.txt seqkit grep -f unique_ids.txt in.fa | seqkit rmdup -n > out.fa
方案2:使用seqtk + awk
seqtk本身没有内置去重参数,我们可以用awk脚本过滤提取后的结果,只保留每个ID的第一次出现:
seqtk subseq in.fa in.txt | awk ' /^>/ { if (!ids[$1]++) { print keep = 1 } else { keep = 0 } next } keep' > out.fa
seqtk subseq in.fa in.txt:提取指定ID的序列- awk脚本逻辑:遇到以
>开头的ID行时,检查是否已经记录过该ID;未记录则打印ID行,并标记后续的序列行需要打印;已记录则跳过ID行,后续序列行也不打印
同样,如果TXT列表有重复ID,也可以先去重再处理:
tr ' ' '\n' < in.txt | sort -u > unique_ids.txt seqtk subseq in.fa unique_ids.txt | awk ' /^>/ { if (!ids[$1]++) { print keep = 1 } else { keep = 0 } next } keep' > out.fa
执行上述命令后,就能得到每个ID仅出现一次的目标序列了。
内容的提问来源于stack exchange,提问作者user3224522




