![如何成批处理我的数据文件(不使用应用程序并行)?](https://linux22.com/image/129071/%E5%A6%82%E4%BD%95%E6%88%90%E6%89%B9%E5%A4%84%E7%90%86%E6%88%91%E7%9A%84%E6%95%B0%E6%8D%AE%E6%96%87%E4%BB%B6%EF%BC%88%E4%B8%8D%E4%BD%BF%E7%94%A8%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%B9%B6%E8%A1%8C%EF%BC%89%EF%BC%9F%20.png)
我有一个分析程序和一个包含数据的文本文件,为了便于说明,我将分别调用wibble
和data.txt
。
我尝试了一个简单的for
循环来处理我的所有数据:
for i in $(cat data.txt);做 摆动 $i 完毕
但一一分析完却需要很长的时间。
所以我尝试让它为每个数据分拆单独的工作:
for i in $(cat data.txt);做 (摆动 $i )& 完毕
但是运行如此多的分析进程会导致内存崩溃!
所以我想以五人为一组来启动分析过程。我想获取前五个数据项,对这些数据项启动分析过程;然后取接下来的五个并做同样的事情;等等。
我怎样才能做到这一点,而不使用程序“并行”,如之前的帖子(如下)所述?我在我的机构工作站上没有 sudo 权限来安装此应用程序,因此我尝试使用更简单的代码来实现此目标。
https://unix.stackexchange.com/questions/299346/running-commands-at-once
https://unix.stackexchange.com/questions/361505/how-to-control-for-loop
答案1
使用 GNU xargs
:
xargs -rn 1 -P 5 -a file wibble
这会在arrall中运行最多 5 个wibble
命令,每个命令从as 参数中获取 1 个单词。P
file
对于 GNU 来说,xargs
单词由空格、制表符或换行符序列分隔,并且单引号、双引号和反斜杠被识别为这些分隔符以及彼此之间的引用运算符。
为了字在文件的每一行添加一个-d '\n'
.
为了字要像在 on 的方法中一样对待bash
,默认情况下(除非被修改)它们$IFS
在空格、制表符和换行符上分隔,并且还受文件名生成的影响,您可以执行以下操作:
xargs -rn 1 -P 5 -0a <(printf '%s\0' $(<file)) wibble
也就是说,让 shell 执行 split+glob 并将printf
结果单词传递给xargs
.