运行 bash 使用 gnu 并行的脚本

Running bash script using gnu parallel

我的脚本使用 while read 逐行处理一些文件..

当我这样做时:

head -n5 file1 | ./myscript.sh

我的成绩很好。

但尝试使用 gnu 对其进行并行化 parallel:

head -n5 file1 | parallel -j 4 ./myscript.sh

生成 result 文件为空!?

我也尝试过:

parallel -j 4 -a file1 ./myscript.sh

但还是不行。我试图做类似于他们所说的 文档,但没有任何成功。 我做错了什么?

编辑:

也许这可以帮助:

head -n5 file1 | parallel -a - -j 4 echo #this works
head -n5 file1 | parallel -a - -j 4 ./myscript #this doesn't

parallel 不会将输入行发送到给定命令的 stdin,而是将行附加到您提供的命令。

如果你像你那样写,那么你实际上是在调用 ./myscript.sh <INPUT>,你想调用 ./myscript.sh,并将输入发送为 stdin.

这应该有效:

head -n5 file1 | parallel -j 4 "echo {} | ./myscript.sh"

{} 指示 parallel 您希望输入的位置,而不是最后的默认值。

--pipe是为你量身定做的:

cat file1 | parallel --pipe -N5 ./myscript.sh

但是您需要更改 myscript.sh,这样它就不会保存到 result,而是将输出打印到标准输出。那么你可以:

cat file1 | parallel --pipe -N5 ./myscript.sh > result

并避免任何混合。