【发布时间】:2018-12-11 17:10:12
【问题描述】:
我有一个平面文件,其中每个簇包含多个序列比对。文件的概念是这样的:
# Input file.fasta
>ID1
>ID1
BSMCMKMA
>ID2
OINAOINV
>ID3
MPOMMSG
>ID4
>ID4
MMVAMOPMOP
>ID5
MMIOPMMOPVOM
>ID6
>ID6
POOPAMPOFM
新集群的启动模式是代表序列的 ID 出现两次。所以在例子中是三个簇,第一个包含ID1、ID2、ID3,第二个包含ID4、ID5,第三个只包含ID6,因为在簇中基本上只有一个序列。
如何读取文件并为每个集群创建一个文件,其阈值是集群应包含至少两个 ID 序列对,例如 (ID1, ID2, ID3) 和 (ID4, ID5 ),它们的序列每个括号都写在一个文件中,但不是 (ID6),因为它只包含一个序列。
# desired output
# file_ID1.fasta
>ID1
BSMCMKMA
>ID2
OINAOINV
>ID3
MPOMMSG
# file_ID4.fasta
>ID4
MMVAMOPMOP
>ID5
MMIOPMMOPVOM
我考虑过使用 awk,但我不知道如何编写 awk 应该寻找的模式!我确信我可以找到使用 python 的方法,但我希望 bash 有更好更快的方法。
感谢您的帮助!
【问题讨论】:
-
向我们展示您所做的任何努力,即使它们微不足道且不起作用
-
那不是格式正确的 fasta 文件。我很确定这是对原始文件进行预处理的结果。如果您在另一个文件中获取组信息并将其与原始 fasta 一起使用来安排组,也许会更容易。
-
@Inian 我尝试了 awk/gawk 并且可以找到方法!我将立即发布:
gawk '{ if($1 ~ ">") {if (prev==$1) {n++} ; prev=$1 ; next} else {print prev > "ID"n; print > "ID"n}}' input.fasta我基本上为上一行和下一行(上一行,下一行)设置变量,并使用计数器 n++ 来命名新文件。 @Poshi 你是对的,该文件来自一个聚集的多序列比对数据库!我希望我澄清了一切。 -
@MaximilianSenftleben 干得好。当您开始写入新文件时,您应该
close()旧文件以避免文件描述符用完。此外,您应该将该评论复制到答案中以获得当之无愧的声誉。