如何在 Bash 中迭代列表中的所有配对组合?

如何在 Bash 中迭代列表中的所有配对组合?

我在 bash 中定义一个列表,如下所示:

list="element1 element_2 my_element_3 element04"

我想要做一个循环,遍历所有可能的配对组合。在 Perl 中,我会使用 while/foreach 并在列表中进行移位,如下所示:

while (my $element1 = shift (@list)) {
  foreach my $element2 (@list) {
      print "$element1 - $element2\n";
  }
}

我不希望对中有相同的元素,也不关心对的顺序,所以如果列表是“AB C”,则结果应该是:

A - B
A - C
B - C

我怎样才能在 bash 中做等效的事情?

答案1

最简单的方法似乎是使用位置参数。

set -- value1 value2 "value with spaces"
for a; do
    shift
    for b; do
        printf "%s - %s\n" "$a" "$b"
    done
done

答案2

思考问题的另一种方式是:如果列表中的每个项目都有(i,j)索引,那么您只会对对角线上方(或下方)的项目集感兴趣(即,i>j)。

如果您确实想要所有组合,那么您只需测试 i!=j 的位置。

我想做类似的事情:生成 4 个项目的所有可能排序。 For嵌套深度为 4 的循环不太漂亮,也没有想到优雅的条件,但这个解决方案做到了:

$ for combo in  {en,fa,sp,ru}{en,fa,sp,ru}{en,fa,sp,ru}{en,fa,sp,ru}; do echo $combo; done | egrep -v 'en.*en|fa.*fa|sp.*sp|ru.*ru' 
enfaspru
enfarusp
enspfaru
ensprufa
enrufasp
enruspfa
faenspru
faenrusp
faspenru
faspruen
faruensp
faruspen
spenfaru
spenrufa
spfaenru
spfaruen
spruenfa
sprufaen
ruenfasp
ruenspfa
rufaensp
rufaspen
ruspenfa
ruspfaen

答案3

将输出转储到标准输出,通过管道进行排序 -u

相关内容