如何将来自不同目录的相似命名序列文件分类为单个大型 fasta 文件
How to cat similar named sequence files from different directories into single large fasta file
我正在努力完成以下工作。我有大约 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.
我试图用一个循环来解决这个问题(但这对我来说永远不会结束!):
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) 但我无法根据我的情况编辑它们。
有人可以帮我吗?谢谢!
在你的物种目录所在的根目录中,你应该运行以下内容:
$ mkdir output
$ find Species* -type f -name "*.fasta" -exec sh -c 'cat {} >> output/`basename {}`' \;
递归遍历所有文件,将basename相同的文件内容合并到output目录下
编辑: 尽管这是一个公认的答案,但在评论中,OP 提到实际目录与常见模式不匹配 Species*
,如中所示原来的问题。在这种情况下,您可以使用:
$ find -type f -not -path "./output/*" -name "*.fasta" -exec sh -c 'cat {} >> output/`basename {}`' \;
这样,我们不指定搜索模式,而是明确省略 output
目录以避免重复已处理的数据。
我正在努力完成以下工作。我有大约 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.
我试图用一个循环来解决这个问题(但这对我来说永远不会结束!):
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) 但我无法根据我的情况编辑它们。
有人可以帮我吗?谢谢!
在你的物种目录所在的根目录中,你应该运行以下内容:
$ mkdir output
$ find Species* -type f -name "*.fasta" -exec sh -c 'cat {} >> output/`basename {}`' \;
递归遍历所有文件,将basename相同的文件内容合并到output目录下
编辑: 尽管这是一个公认的答案,但在评论中,OP 提到实际目录与常见模式不匹配 Species*
,如中所示原来的问题。在这种情况下,您可以使用:
$ find -type f -not -path "./output/*" -name "*.fasta" -exec sh -c 'cat {} >> output/`basename {}`' \;
这样,我们不指定搜索模式,而是明确省略 output
目录以避免重复已处理的数据。