【问题标题】:GNU parallel combinatorics, usage of list of argument multiple timesGNU并行组合,多次使用参数列表
【发布时间】:2018-02-28 03:14:46
【问题描述】:

我想使用以下方法生成唯一的作业,其中 {1} 和 {2} 是唯一的元组:

parallel echo {1} {2} ::: A B C D ::: A B C D

例如在python(itertools)中提供了这样一个组合生成器:

permutations('ABCD', 2)

AB AC AD BA BC BD CA CB CD DA DB DC


有没有办法通过 bash 直接实现它?还是 GNU 并行? 也许以某种方式跳过多余的工作?但是,我如何检查已经使用了哪些参数组合。

parallel echo {= 'if($_==3) { skip() }' =} ::: {1..5}

【问题讨论】:

    标签: linux bash parallel-processing combinations gnu


    【解决方案1】:

    如果值是唯一的:

    parallel echo {= 'if($arg[1] eq $arg[2]) { skip() }' =} ::: A B C D ::: A B C D
    

    或更笼统地说:

    parallel echo \
      '{= my %seen; for my $a (@arg) { $seen{$a}++ and skip() } =}' \
      ::: A B C D ::: A B C D ::: A B C D
    

    如果您想将AB 视为BA,那么这只会运行其中一种组合:

    parallel echo \
      '{= for my $t (2..$#arg) { if($arg[$t-1] ge $arg[$t]) { skip() } } =}' \
      ::: A B C D ::: A B C D ::: A B C D
    

    如果您经常使用这些,请记住您可以使用 --rpl 将其放入 ~/.parallel/config 来制作自己的替换字符串

    --rpl '{unique} my %seen; for my $a (@arg) { $seen{$a}++ and skip() }'
    --rpl '{choose_k} for my $t (2..$#arg) { if($arg[$t-1] ge $arg[$t]) { skip() } }'
    

    然后运行:

    parallel echo {unique} ::: A B C D ::: A B C D ::: A B C D
    parallel echo {choose_k} ::: A B C D ::: A B C D ::: A B C D
    

    【讨论】:

      【解决方案2】:

      一个丑陋的解决方案:使用 Python 生成序列和--link 选项(或--xapply):

      $ parallel --xapply echo {1} {2} ::: $(python  -c "from itertools import permutations ; print(' ::: '.join([' '.join(_) for _ in zip(*list(permutations('ABCD',2)))]))")
      A B
      A C
      A D
      B A
      B C
      B D
      C A
      C B
      C D
      D A
      D B
      D C
      

      【讨论】:

        【解决方案3】:

        如果您不介意,可以使用两次parallel

        # filter the first's parallel output for accepted combinations and pipe into a 2nd parallel
        parallel echo {1} {2} ::: a b c ::: a b c | awk '{ if ($1 != $2) {print $0}}' | parallel echo this is the actual {1} {2}
        
        # no one-liner for better maintenance
        parallel echo {1} {2} ::: a b c ::: a b c | awk '{ if ($1 != $2) {print $0}}' > myargs
        parallel --arg-file myargs echo {1} {2}
        rm myargs
        
        # Output is in both cases
        a b
        a c
        b a
        b c
        c a
        c b
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-28
          • 2016-07-02
          • 2018-06-24
          相关资源
          最近更新 更多