我有一个分析程序和一个包含数据的文本文件,为了便于说明,我将分别调用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在Paralel 中最多运行 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.
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |