教程讲解:
The input source can be a file:
parallel -a abc-file echo
但这实际上是如何工作的?我想获取输入文件:seq 1000
并通过管道对其进行处理,但我找不到任何方法。
尝试 1:
parallel --verbose -a <(seq 50) -l 10 -j 5 echo
--> 这只需要 50 行,将其分成 10 行,并使用 10 个参数调用 echo。我们不想要这个。
尝试2:
parallel -a <(seq 50) -l 10 -j 5 --pipe cat
将会“挂起”,因为:
seq 5 | parallel -a <(seq 50) -l 10 -j 5 --pipe cat
它不是从文件读取而是从标准输入读取。
从文件读取并将各部分放入文件标准输入的正确方法是什么?
好的,我知道我可以写:
seq 50 | parallel -l 10 -j 5 --pipe wc -l
但我真的希望并行从文件中读取它(我认为这可能比 bash 管道更快),但由于某种原因,这也不起作用,因为结果是 50,这意味着除以 10 在这里不起作用。好吧,假设它很快,所以没有达到 -j 5 的限制,所以如果我们尝试:
seq 50 | parallel -l 10 -j 5 --pipe bash -c 'wc -l;sleep 1;'
我期望生成 10 行中的 5 行,但是相反:
50 50 141
是。为什么呢?
答案1
我认为您正在寻找--pipe-part
:
seq 100000000 > bigfile
parallel --pipe-part -a bigfile --block -1 wc
至于为什么你的尝试会失败:--pipe
只能从 stdin 读取。这是因为它可以与:::
、::::
和结合使用-a
。
一个简单的(不是很有用)的例子,以 3 种不同的方式做同样的事情:
seq 460000 | parallel --pipe --tag grep {} ::: 1 2 3
seq 3 > 3file
seq 460000 | parallel --pipe --tag grep {} :::: 3file
seq 460000 | parallel --pipe --tag -a 3file grep {}