【问题标题】:Create output files for pattern of reoccurring lines为重复出现的线条模式创建输出文件
【发布时间】: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() 旧文件以避免文件描述符用完。此外,您应该将该评论复制到答案中以获得当之无愧的声誉。

标签: bash unix


【解决方案1】:

回答我自己的问题,以下是答案:

gawk '{ if($1 ~ ">") {if (prev==$1) {n++} ; prev=$1 ; next} else {print prev > "ID"n; print > "ID"n; close()}}' input.fasta

【讨论】:

    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2020-06-13
    • 2012-09-13
    相关资源
    最近更新 更多