Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 如何将不同目录中的相似命名序列文件转换为单个大型fasta文件_Loops_Unix_Concat - Fatal编程技术网

Loops 如何将不同目录中的相似命名序列文件转换为单个大型fasta文件

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

我正在努力完成以下工作。我有大约40个不同物种的目录,每个目录都有100个包含同源序列的序列文件。序列文件的名称与每个物种目录相似。我想将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.
我试图通过一个循环来解决这个问题(但这对我来说永远不会有好的结局!)

这导致了空文件和错误。我确实尝试在其他地方找到解决方案,例如:(,),但我无法将它们编辑到我的案例中


有人能帮我一下吗?谢谢

在物种目录所在的根目录中,应运行以下操作:

$ 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 {}`' \;