通过与 bash 中的 id 行的部分匹配来过滤 multi-entry .fasta 文件

Filter multi-entry .fasta file by partial match to id line in bash

我有一个.fasta文件,例如:

>LTR22_Mio  ERV2    Microtus ochrogaster
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcacaagcttcaaggaagagt
gcccgcagagaaggtgtgtgtgctgtgcttcctgcatcggagcccttgcacttttggcattacctgctta
tgttctaaggaatacagtctggtttcttctggaagggaagatagtatgtttaagtttccagagtctactg
>LTR23  ERV2    Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcaca
>LTR_IAP    ERV2    Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcacaagcttcaaggaagagt
gcccgcagagaaggtgtgtgtgctgtgcttcctgcatcggagcccttgcacttttggcattacctgctta
tgttctaaggaatacagtctggtttcttctggaagggaagatagtatgtttaagtttccagagtctactg
atgagacattgccatatacaggagtatatgatgctaatggaggaagatgggttaacattcaaggcaaaaa

我正在尝试提取所有 headers(以 >... 开头的行)和以下文本块,直到下一个 > 与特定模式部分匹配,在我的示例中:"Mus musculus"。理想的结果是:

>LTR23  ERV2    Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcaca
>LTR_IAP    ERV2    Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcacaagcttcaaggaagagt
gcccgcagagaaggtgtgtgtgctgtgcttcctgcatcggagcccttgcacttttggcattacctgctta
tgttctaaggaatacagtctggtttcttctggaagggaagatagtatgtttaagtttccagagtctactg
atgagacattgccatatacaggagtatatgatgctaatggaggaagatgggttaacattcaaggcaaaaa

我尝试 google 解决这个相对常见的问题,但只找到了 third-party 个包,但希望有一个基于 bash 的本地解决方案。

我找到了 grep one-liner,但它输出的不是 "header" 行之后的完整文本块(来源:https://www.biostars.org/p/319099/):

grep -w -A 2 -f pattern.txt myfile.fasta --no-group-separator

pattern.txt:

Mus Musculus

非常感谢您的支持!

如果 awk 是您的选择,请您尝试以下操作:

awk 'BEGIN {RS = "(^|\n)>"}
   /Mus Musculus/ {
        sub(/\n$/, "");
        print ">" [=10=]
   }
' file.fasta

输出:

>LTR23  ERV2    Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcaca
>LTR_IAP    ERV2    Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcacaagcttcaaggaagagt
gcccgcagagaaggtgtgtgtgctgtgcttcctgcatcggagcccttgcacttttggcattacctgctta
tgttctaaggaatacagtctggtttcttctggaagggaagatagtatgtttaagtttccagagtctactg
atgagacattgccatatacaggagtatatgatgctaatggaggaagatgggttaacattcaaggcaaaaa
  • 语句BEGIN {RS = "(^|\n)>"}分配记录分隔符RS 正则表达式表示“文件开头的字符 > 或在换行符之后”将文件拆分为由以下内容组成的记录 一对 header 线和基线。
  • 模式/Mus Musculus/指定打印记录的条件。
  • 语句sub(/\n$/, "")去掉了结尾多余的换行符 文件。
  • 语句print ">" [=18=]输出字符前的记录 > 作为记录分隔符丢失。