【问题标题】:Printing a sequence from a fasta file从 fasta 文件打印序列
【发布时间】:2014-11-26 11:45:37
【问题描述】:

我经常需要在 fasta 文件中找到特定的序列并打印出来。对于那些不知道的人,fasta 是一种用于生物序列(DNA、蛋白质等)的文本文件格式。这很简单,你有一行序列名称以'>'开头,然后直到下一个'>'之后的所有行都是序列本身。例如:

>sequence1
ACTGACTGACTGACTG
>sequence2
ACTGACTGACTGACTG
ACTGACTGACTGACTG
>sequence3
ACTGACTGACTGACTG

我目前获得所需序列的方式是使用 grep 和 -A,所以我会这样做

grep -A 10 sequence_name filename.fa

如果我在文件中看不到下一个序列的开始,我会将 10 更改为 20 并重复,直到我确定我得到了整个序列。

似乎应该有更好的方法来做到这一点。例如,我可以要求它打印到下一个 '>' 字符吗?

【问题讨论】:

    标签: bash grep fasta


    【解决方案1】:

    使用> 作为记录分隔符:

    awk -v seq="sequence2" -v RS='>' '$1 == seq {print RS $0}' file
    
    >sequence2
    ACTGACTGACTGACTG
    ACTGACTGACTGACTG
    

    【讨论】:

    • +1 不错。我想你知道如果你把RS='>'放在脚本之后但文件之前,你可以保存-v...
    • 我愿意,但我喜欢把变量放在前面,把文件放在最后(很像 BEGIN 块可以出现在脚本的任何地方,但通常出现在开头)。
    【解决方案2】:

    可能是这样的:

    awk '/>sequence1/{p++;print;next} /^>/{p=0} p' file
    

    因此,如果该行以>sequence1 开头,则设置一个标志(p)以开始打印,打印此行并移至下一行。在随后的行中,如果该行以> 开头,则更改p 标志以停止打印。一般来说,如果设置了标志p,则打印。

    或者,对您的 grep 解决方案进行一些改进,使用它来切断 -A (after) 上下文:

    grep -A 999999 "sequence1" file | awk 'NR>1 && /^>/{exit} 1'
    

    因此,在sequence1 之后最多打印 999999 行并将它们通过管道传输到 awk。然后,Awk 在第 1 行之后的任何行的开头查找 >,如果找到则退出。在此之前,1 会导致 awk 执行其标准操作,即打印当前行。

    【讨论】:

      【解决方案3】:

      仅使用sed

      sed -n '/>sequence3/,/>/ p' | sed '${/>/d}'
      

      【讨论】:

        【解决方案4】:
        $ perl -0076 -lane 'print join("\n",@F) if $F[0]=~/sequence2/' file
        

        【讨论】:

          猜你喜欢
          • 2014-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-23
          • 1970-01-01
          • 1970-01-01
          • 2020-06-03
          相关资源
          最近更新 更多