gnu 并行:结合使用 --pipe 和 args

Posted

技术标签:

【中文标题】gnu 并行:结合使用 --pipe 和 args【英文标题】:gnu parallel: combined use of --pipe and args 【发布时间】:2019-01-09 17:52:21 【问题描述】:

使用--pipe -N<int> 我可以发送给定数量的行作为parallel 启动的作业的输入。但是,我如何才能在每个块上使用 ::: 给出的不同参数运行多个作业?

让我们来看看这个小输入文件:

A   B   C
D   E   F
G   H   I
J   K   L

此外,让我们将每两行定义为一个parallel 作业。并且在它们上执行命令cut -f<int> 应该使用列号作为并行输入参数,例如::: 1..3

因此对于给定的示例,输出将如下所示

A
D
B
E
C
F
G
J
H
K
I
L

我试过这个命令:

cat input.txt|parallel --pipe -N2 'cut -f1' ::: 1..3

但是输出是这样的:

A
D
I
L

我错过了什么?

脚蹼

【问题讨论】:

【参考方案1】:

这个:

cat input.txt|parallel --pipe -N2 'cut -f1' ::: 1..3

从每个输入源读取 2 条记录。如果你这样做会更清楚:

$ cat input.txt|parallel --pipe -v -N2 'cut -f' ::: 1..3
cut -f1  -f2
cut: only one type of list may be specified
Try 'cut --help' for more information.
cut -f3
I
L

GNU Parallel 将每个参数与一个块配对。您正在寻找的更像是--tee,其中每个块都发送到每个命令。但是,--tee 不会将输入分成块,而是将所有输入发送到命令。所以也许我们可以将两者结合起来:

doit()  parallel --pipe -N2 -v cut -f$@; 
export -f doit
cat input.txt|parallel --pipe --tee -v doit  ::: 1..3

或者你可以翻转顺序(这可能效率较低):

doit()  parallel -v --pipe --tee cut -f ::: 1..3; 
export -f doit
cat input.txt|parallel --pipe -N2 -v doit

如果您对正在运行的内容感到满意,请删除 -v

--tee 非常高效(--pipe 为 1-2 GBytes/s,--pipepart 为 2-3 GBytes/s),但它的缺点是它并行启动所有作业:所以如果你而不是 1..3 有 10000 个值,那么它将启动 10000 个进程。

【讨论】:

您好 Ole,感谢您的详细回答。下周我会和它一起玩。

以上是关于gnu 并行:结合使用 --pipe 和 args的主要内容,如果未能解决你的问题,请参考以下文章

使用 if else 和 xargs 并行管道到 gnu

sh 使用cytominer_scripts和GNU parallel并行处理平板

“查找”和“ls”与 GNU 并行

使用 python 子进程运行 GNU 并行命令

gnu并行管道sed - 没有输入文件错误

我应该在 openMP 并行区域内使用 gnu 并行模式函数吗(for-loop,tasks)