如何统计Fasta文件中每个物种对应序列的字符'1'数量
Fasta按序列条目统计字符'1'个数方案
你已知的grep -c 1 file只能统计整个文件内包含'1'的行数,无法按单个物种对应的序列维度分组计数,用awk一行命令即可实现需求,同时兼容标准Fasta中单条序列拆分为多行的格式:
awk '/^>/ { if (exist_id) print count print $0 exist_id = $0 count = 0 next } { gsub(/[^1]/, "") count += length($0) } END {print count}' 你的fasta文件路径
命令逻辑说明:
- 匹配到
>开头的序列ID行时:如果已经记录过前一个序列的ID,先打印前一个序列的'1'统计值;接着打印当前ID行,重置计数器为0,跳过后续处理读取下一行 - 匹配到序列行时:删除该行所有非'1'的字符,剩余字符串的长度就是该行包含'1'的个数,累加到计数器
- 所有行读取完成后,打印最后一个序列的统计值
用你给出的示例文件运行该命令,输出结果完全符合预期:
>111 5 >102 4
如果你的Fasta文件是严格的「1行ID+1行序列」格式(无多行序列),可以用更简短的命令实现:
paste - - < 你的fasta文件路径 | awk -F '\t' '{print $1; gsub(/[^1]/,"",$2); print length($2)}'
该命令通过paste先将每两行合并为一行(第一列为ID,第二列为序列),再直接统计第二列中'1'的个数即可,写法更简洁,但遇到多行序列的Fasta会统计错误。
内容的提问来源于stack exchange,提问作者Alex galvez morante
相关产品推荐
相关产品推荐

