如何按ID合并序列文件?Python实现存问题,求awk解法
用awk合并FASTA格式中相同ID的序列
刚好碰到过类似的需求!你的原始序列是这样的:
rpl-7 ATGGCTCCAAC
rpl-7 AAGAAAGTGCCACAGGTTCCAGAAAC
rpl-8 AAGAACAAGGAGAAGAAGACCCAATACTTCAAGCGTGC
rpl-8 GCTCTCCAGATCCTCCGTCTTCGTCAGATCAA
rpl-8 AAGTTCAACATCATCTGTCTTGAGGA
想要合并成同ID的序列在一行、用空格分隔的形式,用awk确实是最简便的方案,一行命令就能搞定:
awk '/^>/ {if (id != $0) {if (id) print id, seq; id=$0; seq=""; next}} {seq=seq" "$0} END {print id, seq}' input.fasta
我给你拆解一下这段代码的逻辑,方便你理解和调整:
- 匹配所有以
>开头的行(FASTA的ID行):- 如果当前ID和之前存储的
id不同,先判断id是否不为空(避免第一行就输出空内容),若不为空则打印之前的ID和累积的序列 - 更新
id为当前行内容,重置seq为空字符串,跳过后续处理
- 如果当前ID和之前存储的
- 非ID行(序列行):直接将当前行内容追加到
seq变量后,用空格分隔 - 处理完所有行后(
END块):打印最后一组的ID和序列(因为循环中仅在ID变化时打印前一组,最后一组不会触发该逻辑)
如果你的序列内容是从标准输入来的(比如直接粘贴或者通过管道传递),也可以这样使用:
cat your_sequence.txt | awk '/^>/ {if (id != $0) {if (id) print id, seq; id=$0; seq=""; next}} {seq=seq" "$0} END {print id, seq}'
另外提一句你之前Python的问题:你说无法输出第一个ID,大概率是因为你只在ID变化时打印前一组,但第一个ID的序列累积完成后,没有在循环结束后打印最后一组的内容。只要在遍历完所有行后,单独打印最后保存的ID和序列,就能解决这个问题啦。
内容的提问来源于stack exchange,提问作者Katniss Dong
相关产品推荐
相关产品推荐

