GNU平行组合学,多次参数列表的使用情况



我想使用以下来生成独特的作业,其中{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 db


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

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

如果值是唯一的:

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将其放入〜/.parallall/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

一个丑陋的解决方案:使用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

如果您不介意,则可以两次使用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

最新更新