gpt4 book ai didi

linux - 具有多个参数的 Gnu Parallel - 选择性命令执行

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:39 29 4
gpt4 key购买 nike

我有一个程序接受 3 个参数 -t、-a 和 -s - 例如,

./Run -t 1500 -a 150000 -s filename

此程序会将数据作为一行(7 列)附加到文件“文件名”的末尾。

我想研究这两个参数如何影响范围 t in (1500,150000 [步长 5000]) 和 a in (500,600000 [步长 500]) 的输出。到目前为止,我正在做的是,

parallel -j+0 ./Run -t {2} -a {1} :::: <(seq 500 500 600000) :::: <seq(1500 5000 15000)

可以看出,对于参数 a 的每个值,参数 t 都扫过它的范围。这会将所有数据打印到文件中,好吧。

但为了便于使用数据,我希望它在每个参数 a 被完全评估后向文件添加 2 个空行,以便我可以继续处理。这意味着我应该添加

echo "" >> filename

每次更新参数a。

我如何使用 gnu 并行执行此操作?

最佳答案

我发现并行追加到同一个文件很可怕:在某些情况下这样做是安全的,但在很多情况下都不安全:

# Generate files with a single very long line
parallel -j0 perl -e '\$a=\"1{}\"x10000000\;print\ \$a,\"\\n\"' '>' {} ::: {a..z}
rm -f out.par
# Grep for the single line in parallel - append to same file
parallel -j0 'grep 1 >> out.par' ::: {a..z}
# This ought to only give a single line for each letter
# But because of race condition some lines are split into two
parallel --tag 'grep {} out.par | wc -l' ::: {a..z}
rm out.par
# Do the same in serial (no race condition)
parallel -j1 'grep 1 >> out.par' ::: {a..z}
# Only a single line per letter
parallel --tag 'grep {} out.par | wc -l' ::: {a..z}
# Do the same in parallel but with serialized output (no race condition)
parallel -j0 grep 1 ::: {a..z} > out.par
# Only a single line per letter
parallel --tag 'grep {} out.par | wc -l' ::: {a..z}

所以如果我是你,我会首先更改 ./Run 以输出到 stdout(标准输出),这样你就可以:

./Run -t 1500 -2 500 > filename
# And in parallel:
parallel ./Run -t {2} -2 {1} :::: <(seq 500 500 600000) :::: <(seq 1500 5000 15000) > filename

要解决您最初的问题,我们需要同意,顺序确实很重要:如果作业以完全随机的顺序输出,这是 Not Acceptable 。因此我们需要--keep-order (-k)。

parallel -k ./Run -t {2} -2 {1} :::: <(seq 500 500 600000) :::: <(seq 1500 5000 15000) > filename

现在我们只需要做一些只在第一个参数为 11500 时运行的东西:

parallel -k './Run -t {2} -2 {1}; if [ {2} -eq 11500 ]; then echo "";fi' :::: <(seq 500 500 600000) :::: <(seq 1500 5000 15000) > filename

我不确定你需要它做什么,但你可能想看看 --tag,因为它可能对你有用。

关于linux - 具有多个参数的 Gnu Parallel - 选择性命令执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36371914/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com