使用gnu parallel运行bash脚本

bra*_*ito 5 parallel-processing bash gnu-parallel

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

当我做:

head -n5 file1 | ./myscript.sh
Run Code Online (Sandbox Code Playgroud)

我的结果很好.

但尝试使用gnu并行化它parallel:

head -n5 file1 | parallel -j 4 ./myscript.sh
Run Code Online (Sandbox Code Playgroud)

产生result文件空!?

我也尝试过:

parallel -j 4 -a file1 ./myscript.sh
Run Code Online (Sandbox Code Playgroud)

但仍然无法正常工作.我试图做类似于他们在文档中所说的内容,但没有任何成功.我究竟做错了什么?

编辑:

也许这可以帮助:

head -n5 file1 | parallel -a - -j 4 echo #this works
head -n5 file1 | parallel -a - -j 4 ./myscript #this doesn't
Run Code Online (Sandbox Code Playgroud)

gan*_*ter 6

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

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

这应该有效:

head -n5 file1 | parallel -j 4 "echo {} | ./myscript.sh"
Run Code Online (Sandbox Code Playgroud)

{}指示parallel您要输入去,而不是在最后的默认。


Ole*_*nge 5

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

cat file1 | parallel --pipe -N5 ./myscript.sh
Run Code Online (Sandbox Code Playgroud)

但是您需要进行更改,myscript.sh以便它不会保存到result而是将输出打印到标准输出。然后你可以:

cat file1 | parallel --pipe -N5 ./myscript.sh > result
Run Code Online (Sandbox Code Playgroud)

并避免任何混合。