You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从FASTA文件中提取指定ID的唯一序列?

解决FASTA序列提取时的重复问题

你遇到的重复问题,本质是因为目标FASTA文件里存在相同ID的重复序列条目,而seqkit grepseqtk 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

火山引擎 最新活动