mda*_*ies 5 linux parallel-processing bash combinations gnu
我想使用以下来生成唯一的作业,其中{1}和{2}是唯一的元组:
parallel echo {1} {2} ::: A B C D ::: A B C D
Run Code Online (Sandbox Code Playgroud)
例如在python(itertools)中提供了这样一个组合生成器:
permutations('ABCD', 2)
Run Code Online (Sandbox Code Playgroud)
AB AC AD BA BC BD CA CB CD DA DB DC
有没有办法直接通过bash实现它?还是GNU并行本身?也许以某种方式跳过冗余工作?但是,如何检查已使用的参数组合.
parallel echo {= 'if($_==3) { skip() }' =} ::: {1..5}
Run Code Online (Sandbox Code Playgroud)
如果值是唯一的:
parallel echo {= 'if($arg[1] eq $arg[2]) { skip() }' =} ::: A B C D ::: A B C D
Run Code Online (Sandbox Code Playgroud)
或者更一般地说:
parallel echo \
'{= my %seen; for my $a (@arg) { $seen{$a}++ and skip() } =}' \
::: A B C D ::: A B C D ::: A B C D
Run Code Online (Sandbox Code Playgroud)
如果您想将其视为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
Run Code Online (Sandbox Code Playgroud)
如果您经常使用这些,请记住您可以--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() } }'
Run Code Online (Sandbox Code Playgroud)
然后运行:
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
Run Code Online (Sandbox Code Playgroud)
一种丑陋的解决方案:使用 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
Run Code Online (Sandbox Code Playgroud)