我正在尝试编写一个自动运行数据分析程序的脚本。数据分析获取文件,对其进行分析,并将所有输出放入文件夹中。该程序可以同时在两个终端上运行(每个终端分析不同的主题文件)。
我编写了一个可以自动完成所有输入的脚本。但是,我只能让我的脚本自动运行一个。如果我同时运行我的脚本,它将分析同一主题两次(无用)
目前,我的脚本如下:
for name in `ls [file_directory]`
do
[Data analysis commands]
done
如果在两个终端上运行它,它将从包含所有数据文件的目录顶部开始。这是一个问题,因此我尝试检查重复项,但它们并不是非常有效。
我尝试使用if命令进行名称比较(没有工作,因为除了一个输出文件之外的所有输出文件都是唯一的名称,所以它会检查目录顶部的第一个输出文件夹并说出名称即使输出文件夹进一步向下具有相同的名称,它也是不同的)。它看起来像......
for name in `ls <file_directory>`
do
for output in `ls <output directory>`
do
If [ name==output ]
then
echo "This file has already been analyzed."
else
<Data analyis commands>
fi
done
done
我认为这是正确的方法,但显然不是。我需要在作出某些决定之前检查所有名称(而不是一个一个地做出决定)
然后我尝试使用mv命令移动已完成的数据文件(没有工作因为&#34;名称&#34;在for语句中存储了所有文件名,所以无论在什么内容中它都在列表中目前的文件夹)。我记得读过一些关于shell脚本如何在&#34;实时&#34;所以这没有用,这是有道理的。
我的想法是寻找对if语句进行某种修改,以便在做出决定之前进行所有名称检查(如何?)
还有其他可能缺少的命令我可能会尝试吗?
答案 0 :(得分:0)
我经常使用的一种模式是使用split命令。
ls <file_directory> > file_list
split -d -l 10 file_list file_list_part
这将创建file_list_part00等文件到file_list_partnn 然后,您可以将这些文件名提供给脚本。
for file_part in `ls file_list_part*`
do
for file_name in `cat file_part | tr '\n' ' '`
do
data_analysis_command file_name
done
done
答案 1 :(得分:0)
切勿在“for”(http://mywiki.wooledge.org/ParsingLs)
中使用“ls”我认为你应该使用fifo(参见mkfifo)
答案 2 :(得分:0)
作为评论的后续内容,您可以使用homebrew安装 GNU Parallel :
brew install parallel
然后你的命令变为:
parallel analyse ::: *.dat
它将使用与Mac中一样多的CPU内核并行处理所有文件。您还可以添加:
parallel --dry-run analyse ::: *.dat
让它向你显示它将运行的命令而不实际运行任何东西。
您还可以添加--eta
(预计到达时间)以估算作业何时完成,如果您想一次运行8个作业,则可以-j 8
。当然,如果您在要求的时候特别想要2个工作,请使用-j 2
。
您还可以 GNU Parallel 将作业和数据简单地分发到您可能通过ssh
访问权限提供的任何其他计算机上。