Loops 如何将不同目录中的相似命名序列文件转换为单个大型fasta文件
我正在努力完成以下工作。我有大约40个不同物种的目录,每个目录都有100个包含同源序列的序列文件。序列文件的名称与每个物种目录相似。我想将40个物种目录中同名的文件连接到一个名为类似的序列文件中 我的数据如下所示,例如:Loops 如何将不同目录中的相似命名序列文件转换为单个大型fasta文件,loops,unix,concat,Loops,Unix,Concat,我正在努力完成以下工作。我有大约40个不同物种的目录,每个目录都有100个包含同源序列的序列文件。序列文件的名称与每个物种目录相似。我想将40个物种目录中同名的文件连接到一个名为类似的序列文件中 我的数据如下所示,例如: directories: Species1 Species2 Species3 Within directory (similar for all): sequenceA.fasta sequenceB.fasta sequenceC.fasta I want to g
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.
我试图通过一个循环来解决这个问题(但这对我来说永远不会有好的结局!)
这导致了空文件和错误。我确实尝试在其他地方找到解决方案,例如:(,),但我无法将它们编辑到我的案例中
有人能帮我一下吗?谢谢 在物种目录所在的根目录中,应运行以下操作:
$ mkdir output
$ find Species* -type f -name "*.fasta" -exec sh -c 'cat {} >> output/`basename {}`' \;
它递归遍历所有文件,并将具有相同basename的文件的内容合并到输出目录下的一个文件中
编辑:尽管这是一个公认的答案,但OP在评论中提到,真实目录与原始问题中所示的常见模式物种*
不匹配。在这种情况下,您可以使用:
$ find -type f -not -path "./output/*" -name "*.fasta" -exec sh -c 'cat {} >> output/`basename {}`' \;
这样,我们不指定搜索模式,而是显式省略
output
目录,以避免重复已处理的数据。谢谢vtronko,超级帮助。我没有想过使用find。我得到了以下错误,我无法通过在手册页中找到解决方案来解决:find*-typef-name“*.fasta”-exec sh-c'cat{}>>output/
basename{}'find:missing参数改为-exec'`为什么将物种
查找模式改为*
?这样,它偶尔也会从输出
目录开始读取,并且会出现重复,这不是您想要的。此外,您还错过了\
是exec语法的重要部分,不知道为什么要删除它。如果未经修改就运行此程序,会发生什么情况?注意:您在注释中的格式设置失败,您需要将代码包装在三个勾号中。我更改物种的原因是目录中确实有物种的名称,因此没有一致性。\;这是一个遗漏的副本部分!它现在运行,也没有物种部分。非常感谢!我仍然坚持不使用*
glob,因为它也将从输出目录中读取,这将破坏您预期的结果。如果您想保持*
不变,那么添加-not如果您仍然想使用*
,我建议在-type f
之前添加-not-path“/output/*”
,因此它特别排除了target dir。
$ find -type f -not -path "./output/*" -name "*.fasta" -exec sh -c 'cat {} >> output/`basename {}`' \;