我有一个分析程序和一个包含数据的文本文件,为了便于说明,我将分别调用wibble
和data.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)
使用 GNU xargs
:
xargs -rn 1 -P 5 -a file wibble
Run Code Online (Sandbox Code Playgroud)
这wibble
在P
aralel 中最多运行 5 个命令,每个命令从file
as 参数中取出 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
.