Отфильтровать многократный файл .fasta по частичному совпадению со строкой id в bash - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть файл .fasta, например:

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

Я пытаюсь извлечь все заголовки (строки, начинающиеся с >...) и следующий текстовый блок до следующего >, которые частично совпадают по определенному шаблону, в моем примере: "Mus musculus". Идеальным результатом было бы:

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

Я пробовал Google для этой относительно распространенной проблемы и нашел только сторонние пакеты для этого, но надеялся на собственное решение на основе bash.

Я нашел этот grep однострочный, но он выводит не полный блок текста после строки «заголовка» (источник: https://www.biostars.org/p/319099/):

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

pattern .txt:

Mus Musculus

Большое спасибо за вашу поддержку!

1 Ответ

1 голос
/ 25 февраля 2020

Если awk - ваш вариант, попробуйте следующее:

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

Вывод:

>LTR23  ERV2    Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcaca
>LTR_IAP    ERV2    Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcacaagcttcaaggaagagt
gcccgcagagaaggtgtgtgtgctgtgcttcctgcatcggagcccttgcacttttggcattacctgctta
tgttctaaggaatacagtctggtttcttctggaagggaagatagtatgtttaagtttccagagtctactg
atgagacattgccatatacaggagtatatgatgctaatggaggaagatgggttaacattcaaggcaaaaa
  • Оператор BEGIN {RS = "(^|\n)>"} назначает разделитель записей RS в регулярное выражение, означающее «символ > в начале файла или после новой строки», чтобы разбить файл на записи, которые состоят из пары строки заголовка и базовой строки (строк).
  • Шаблон /Mus Musculus/ определяет условие для печати записи.
  • Оператор sub(/\n$/, "") удаляет лишнюю новую строку в конце файла.
  • Оператор print ">" $0 выводит запись с символом >, который теряется в качестве разделителя записей.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...