如何成束处理我的数据文件(不使用应用程序并行)?

1 bash jobs

我有一个分析程序和一个包含数据的文本文件,为了便于说明,我将分别调用wibbledata.txt

我尝试了一个简单的for循环来处理我的所有数据:

for i in $(cat data.txt); 做
    摇晃$i
完毕

但是一一分析完需要很长时间。

所以我试着让它为每个数据分拆单独的工作:

for i in $(cat data.txt); 做
    ( wibble $i ) &
完毕

但是运行这么多分析进程会导致内存崩溃!

所以我想以五个为一组来启动分析过程。我想获取前五个数据项,对它们进行分析;然后取下五个并做同样的事情;等等。

如果不使用之前帖子(波纹管)中解释的“并行”程序,我该如何做到这一点?我在我的机构工作站上没有安装此应用程序的 sudo 权限,因此我尝试使用更简单的代码来实现此目标。

https://unix.stackexchange.com/questions/299346/running-commands-at-once
https://unix.stackexchange.com/questions/361505/how-to-control-for-loop
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 6

使用 GNU xargs

xargs -rn 1 -P 5 -a file wibble
Run Code Online (Sandbox Code Playgroud)

wibbleParalel 中最多运行 5 个命令,每个命令从fileas 参数中取出 1 个单词。

对于 GNU,xargs单词由空格、制表符或换行符序列分隔,并使用单引号、双引号和反斜杠识别为这些分隔符和彼此之间的引用运算符。

对于单词是该文件的每一行,添加一个-d '\n'

对于在您的方法中处理的单词on bash,默认情况下(除非$IFS被修改)以空格、制表符和换行符分隔,并且还受文件名生成的影响,您可以执行以下操作:

xargs -rn 1 -P 5 -0a <(printf '%s\0' $(<file)) wibble
Run Code Online (Sandbox Code Playgroud)

也就是说,让 shell 执行 split+glob 并将printf结果单词传递给xargs.