Как объединить файлы одинаковых именованных последовательностей из разных каталогов в один большой файл fasta - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь сделать следующее. У меня есть около 40 каталогов разных видов, каждый из которых содержит сотни файлов последовательностей, которые содержат ортологичные последовательности. Файлы последовательности одинаково названы для каждого из каталогов видов. Я хочу объединить файлы с одинаковыми именами из 40 каталогов видов в один файл последовательности с одинаковым именем.

Мои данные выглядят следующим образом, например:

directories: Species1 Species2 Species3 
  Within directory (similar for all): sequenceA.fasta sequenceB.fasta sequenceC.fasta

I want to get single files named: sequenceA.fasta sequenceB.fasta sequenceC.fasta 
where the content of the different files from the different species is concatenated.

Я пытался решить это с al oop (но это никогда не кончается со мной!):

ls . | while read FILE; do cat ./*/"$FILE" >> ./final/"$FILE"; done

Это привело к пустым файлам и ошибкам. Я пытался найти решение в другом месте, например: (https://www.unix.com/unix-for-dummies-questions-and-answers/249952-cat-multiple-files-according-file-name.html, https://unix.stackexchange.com/questions/424204/how-to-combine-multiple-files-with-similar-names-in-different-folders-by-using-u), но мне не удалось отредактировать их в моем случае.

Может ли кто-нибудь помочь мне здесь? Спасибо!

1 Ответ

2 голосов
/ 02 апреля 2020

В каталоге root, в котором находятся каталоги видов, вы должны выполнить следующее:

$ mkdir output
$ find Species* -type f -name "*.fasta" -exec sh -c 'cat {} >> output/`basename {}`' \;

Он рекурсивно перебирает все файлы и объединяет содержимое файлов с одинаковым базовым именем в один под output directory.

EDIT: , хотя это был принятый ответ, в комментарии OP упоминалось, что настоящие каталоги не соответствуют общему шаблону Species*, поскольку показано в оригинальном вопросе. В этом случае вы можете использовать это:

$ find -type f -not -path "./output/*" -name "*.fasta" -exec sh -c 'cat {} >> output/`basename {}`' \;

Таким образом, мы не указываем шаблон поиска, а явно опускаем каталог output, чтобы избежать дублирования уже обработанных данных.

...