【问题标题】:Running bash script using gnu parallel使用 gnu 并行运行 bash 脚本
【发布时间】:2015-09-17 18:59:05
【问题描述】:

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

当我这样做时:

head -n5 file1 | ./myscript.sh

我的结果很好。

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

head -n5 file1 | parallel -j 4 ./myscript.sh

产生result 文件为空!?

我也试过:

parallel -j 4 -a file1 ./myscript.sh

但还是不行。我试图做类似于他们所说的 文档,但没有任何成功。 我做错了什么?

编辑:

也许这会有所帮助:

head -n5 file1 | parallel -a - -j 4 echo #this works
head -n5 file1 | parallel -a - -j 4 ./myscript #this doesn't

【问题讨论】:

    标签: bash parallel-processing gnu-parallel


    【解决方案1】:

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

    如果您按照自己的方式编写它,那么您实际上是在调用./myscript.sh <INPUT>,您想在其中调用./myscript.sh,并将输入作为stdin 发送。

    这应该可行:

    head -n5 file1 | parallel -j 4 "echo {} | ./myscript.sh"
    

    {}parallel 指示您希望输入的位置,而不是末尾的默认值。

    【讨论】:

    • 如果脚本正在写入结果文件,那么它可能每次都会覆盖它。您需要将其附加到文件中。 parallel 将为每个输入行创建一个新的脚本实例。
    • 你对追加的看法是对的,但是现在我在文件中的计数器对于每个增量都保持在 1,因为所有这些独立的进程:),无论如何你能解释一下我上面编辑的情况吗?
    • 我不知道你说的计数器是什么意思;脚本是做什么的? echo <SOMETHING> 输出<SOMETHING>,因此您的第一个示例应将每一行打印到stdout。您的脚本需要将输入发送到 stdin,而不是作为参数。
    • 好的,现在并行工作正常,但我得到重复和错误的结果,因为在我的脚本中,我正在通过grep 将一个文件中的单词匹配到另一个大文件中,这不是应该的吗照顾将文件分成每个进程的块,以免它们混合?
    • 脚本的每个实例将只给出一行作为输入。我真的不明白你想用这个脚本做什么。可以发一下吗?
    【解决方案2】:

    --管道是为你量身定做的:

    cat file1 | parallel --pipe -N5 ./myscript.sh
    

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

    cat file1 | parallel --pipe -N5 ./myscript.sh > result
    

    并避免任何混合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 2021-11-30
      • 2017-11-02
      • 2014-04-20
      • 2017-10-22
      • 1970-01-01
      • 2013-11-01
      • 2018-12-13
      相关资源
      最近更新 更多