拆分文件并将拆分部分作为标准输入传递

拆分文件并将拆分部分作为标准输入传递

教程讲解:

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 {}

相关内容