【问题标题】:gnu parallel: space interpretation and within process variable editinggnu 并行:空间解释和进程内变量编辑
【发布时间】:2023-12-31 13:30:01
【问题描述】:

我在使用 gnu 并行时遇到了两个问题。首先是最有趣的:

我有一个文件,其中一行包含两个由空格分隔的参数。这些参数应该一起传递给命令,以使命令可以将它们识别为单独的。

/path/to/A1 /path/to/A2  
/path/to/B1 /path/to/B2  
/path/to/C1 /path/to/C2

此外,我还有第二个变量作为数组。我希望将上面文件中的所有成对参数与所有数组值并行组合。

我快到了,我的代码如下所示。

parallel  -a $tmpdir/inputfiles.txt $instaldir/ribotagger.pl  \
                    -in {1}         \
                    -region {2}     \
                    -out $exitdir/$folder/ribotag.{2} \
                    ::: ${regions[@]}

然而,在这种情况下,并行解释 {1} 不是

/path/to/A1 /path/to/A2

但是作为

/path/to/A1\ /path/to/A2

因此,ribotagger 脚本将其解释为一个长参数,导致立即停止。

第二个问题,我希望每个并行创建的脚本实例的文件夹参数都不同。 我想到了类似的东西

-out $exitdir/$(echo {1} | cut -d "/" -f 4)/ribotag.{2}

但是,看起来 {1} 在 $(stuff) 中无法识别 该脚本需要一个输出参数才能运行。

【问题讨论】:

    标签: bash parallel-processing gnu-parallel


    【解决方案1】:

    我认为你需要这个:

    parallel --colsep ' ' -a inputfiles.txt echo 1={1} 2={2} 3={3} ::: france germany | cat -vet
    1=/path/to/C1 2=/path/to/C2 3=france$
    1=/path/to/C1 2=/path/to/C2 3=germany$
    1=/path/to/B1 2=/path/to/B2 3=germany$
    1=/path/to/B1 2=/path/to/B2 3=france$
    1=/path/to/A1 2=/path/to/A2 3=germany$
    1=/path/to/A1 2=/path/to/A2 3=france$
    

    对于输出文件,您可以使用{#}(即工作编号)来制定您喜欢的内容。

    【讨论】:

    • 哇,你完全正确。我可以发誓 --colsep 参数将每个列解释为一个单独的参数,从而使参数 1 到 3 的所有可能组合。但是,它没有!正如您所说,它一方面使参数 1 + 2(配对)和另一方面参数 3 的所有组合。
    • 另一个补充:我选择使用 {1//} 来代替使用 {#} 作为工作编号(这不容易与原始输入相关),它代表输入的一部分小路。 -out $exitdir/{1//}/file.extension
    • 如果 ribotagger.pl 可以输出到标准输出(可能是 -out - ?),那么使用 --results outdir 可能会很有趣,因为这将创建一个标准化的子目录层次结构。
    • 我完全同意@Ole,GNU 并行已经很好地实现了这一点,这是我的首选方法。我没有想到使用-out - ;我稍后会检查它是否有效。
    最近更新 更多