Разделить несколько файлов fasta по заголовку

Я новичок в биоинформатике и пытаюсь создать несколько файлов fasta из нескольких файлов fasta.

Итак, у меня есть сотни файлов fasta, содержащих сотни строк fasta (последовательности с заголовками). Хочу разделить этот фаст в разные новые файлы фаста по названию вида (указание в шапке).

У меня есть такие файлы: CL0073reads.fas

>>CL0073reads.fas_ang4836665r
TAGGCAGGCGTGGGGGTTTGT
>CL0073reads.fas_ang4864845r
CCTCTTCGGCCCTCA
>CL0073reads.fas_atl679495r
CAAGGACCGTTAGGGGC
>CL0073reads.fas_alb178305r
GCTGACGGCAACGTTAG

Я хочу : CL0073reads_ang.fas

`>CL0073reads.fas_ang4836665r
TAGGCAGGCGTGGGGGTTTGT
>CL0073reads.fas_ang4864845r
CCTCTTCGGCCCTCA`

CL0073reads_atl.fas

`>CL0073reads.fas_atl679495r
CAAGGACCGTTAGGGGC`

CL0073reads_abl.fas

`>CL0073reads.fas_alb178305r
GCTGACGGCAACGTTAG`

Я пытаюсь сделать это с помощью awk в сценарии, чтобы иметь возможность делать это с моими несколькими файлами через for Fas in ${$(find *.fas)}; do awk script.awk<${Fas}

Мне удается преобразовать свои последовательности в однострочную фасту.

Я был бы очень признателен за помощь

Используйте {} в редакторе данных.

James Brown 11.04.2018 12:17

Кроме того, есть специальный сайт по биоинформатике: bioinformatics.stackexchange.com

Sundeep 11.04.2018 12:24

Имя файла всегда состоит из трех символов?

James Brown 11.04.2018 14:25

Собственно, теперь вы спрашиваете, было бы лучше, чтобы имя исходного файла было перед тремя буквами. Редактирую свой вопрос. Простите

PaulineR 11.04.2018 14:37
2
4
875
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вот еще один вариант, просто используя "разновидности" в качестве имени файла, поэтому следует объединить все варианты в одном файле.

$ awk '/>/{close(fn); n=split($0,a,"_|[0-9]+"); fn=a[n-1]} {print >> fn}' file


==> alb <==
>CL0073reads.fas_alb178305r
GCTGACGGCAACGTTAG

==> ang <==
>CL0073reads.fas_ang4836665r
TAGGCAGGCGTGGGGGTTTGT
>CL0073reads.fas_ang4864845r
CCTCTTCGGCCCTCA

==> atl <==
>CL0073reads.fas_atl679495r
CAAGGACCGTTAGGGGC

вы можете свести к минимуму операции открытия / закрытия файла, если файл отсортирован по имени и проверить предыдущее имя, но это намного проще ...

Ответ принят как подходящий

Попробуй это:

find . -name '*.fas' -exec \
awk -F'[>_.]' '
NF>1 {
    close(out)
    out = $NF
    sub(/[0-9].*/,"",out)
    out = $2 "_" out ".out"
}
{ print >> out }
' {} \;

Я добавил к вашим выходным файлам суффикс «.out», чтобы вы могли отделить их от входных файлов «.fas». Измените это в соответствии со своими потребностями. Вы можете использовать + вместо \; в конце find для запуска awk с несколькими файлами одновременно, чтобы немного ускорить процесс, если у вас есть GNU find, но, как написано выше, будет работать с любыми инструментами POSIX.

Вышеупомянутое использует FS (установленный -F) для разделения каждой строки, которая начинается с >, на соответствующие части, затем рекомбинирует, а затем формирует имя выходного файла для этой строки и всего, что следует до следующей строки >. Затем он просто выводит каждую строку в текущее имя выходного файла.

Спасибо большое, работает отлично! (И спасибо за ваше замечание о суффиксе выходных файлов, это помогает мне в другом сценарии) Однако я действительно не понимаю, что происходит, не могли бы вы немного объяснить?

PaulineR 11.04.2018 16:36

Другие вопросы по теме