关于bash:gnu parallel:–pipe和args的组合使用

gnu parallel: combined use of --pipe and args

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

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

1
2
3
4
A   B   C
D   E   F
G   H   I
J   K   L

此外,让我们定义将每两行通过管道传输到parallel作业。在它们上的命令cut -f<int>应该以列号作为输入参数执行,例如::: {1..3}

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

1
2
3
4
5
6
7
8
9
10
11
12
A
D
B
E
C
F
G
J
H
K
I
L

我尝试了以下命令:

1
cat input.txt|parallel --pipe -N2 'cut -f{1}' ::: {1..3}

但是输出是这样的:

1
2
3
4
A
D
I
L

我想念的是什么?

鳍游泳者


此:

1
cat input.txt|parallel --pipe -N2 'cut -f{1}' ::: {1..3}

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

1
2
3
4
5
6
7
$ 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不会将输入分成块,而是将所有输入发送到命令。所以也许我们可以将两者结合起来:

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

或者您可以取消订单(这可能效率较低):

1
2
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个进程。