统计Multifasta文件中去重后的序列ID数量
统计FASTA文件中唯一序列前缀的数量
我来帮你解决这个FASTA序列前缀统计的问题,这里有两种简单高效的命令行方法,完全符合你的需求——只统计下划线前的唯一前缀(比如seqA、seqB这类),不管后面的数字和重复出现的次数:
方法1:用awk(推荐,简洁高效)
awk非常适合处理这种文本提取和去重统计的场景,一行命令就能搞定:
awk '/^>/ {split($0, id, "_"); prefix=substr(id[1],2); seen[prefix]++} END {print "序列数量:" length(seen)}' your_fasta_file.fasta
命令拆解:
/^>/:专门匹配FASTA文件里以>开头的序列ID行split($0, id, "_"):把当前行按下划线分割成数组,比如>seqA_0042_0035会被拆成id[1]=">seqA"、id[2]="0042"等substr(id[1],2):从id[1]的第2个字符开始截取,去掉开头的>,得到纯前缀seqAseen[prefix]++:用数组seen记录每个前缀已经出现过(不管出现多少次,只标记存在)END块:最后输出数组seen的长度,也就是唯一前缀的总数量
用你提供的示例文件测试,输出就是序列数量:4,完全符合预期。
方法2:用grep+cut+sed+sort+uniq组合工具
如果习惯用管道组合基础命令,也可以这样实现:
echo "序列数量:$(grep "^>" your_fasta_file.fasta | cut -d "_" -f 1 | sed 's/^>//' | sort | uniq | wc -l)"
命令拆解:
grep "^>":先提取所有序列ID行cut -d "_" -f 1:按下划线分割,取第一部分(比如>seqA)sed 's/^>//':去掉开头的>,得到纯前缀seqAsort:对所有前缀排序,方便后续去重uniq:去掉重复的前缀,只保留每个前缀一次wc -l:统计去重后的前缀行数,也就是唯一数量echo "序列数量:$(...):把统计结果包装成你需要的输出格式
同样测试你的示例文件,会得到序列数量:4的结果。
小提示:
如果你的FASTA文件里有空的序列ID行(比如示例里最后一行的>seqA_0042_0035 ),这两种方法都能正确处理,只要是>开头的行都会被提取前缀并计数。
内容的提问来源于stack exchange,提问作者Grendel
相关产品推荐
相关产品推荐

