Bagaimana cara mengulangi semua kombinasi pasangan dalam daftar di bash?


5

Saya mendefinisikan daftar dalam bash seperti ini:

list="element1 element_2 my_element_3 element04"

dan saya ingin melakukan loop di mana saya mengulangi semua kombinasi pasangan yang mungkin. Di Perl, saya akan menggunakan while / foreach dengan perubahan pada daftar seperti ini:

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

Saya tidak ingin elemen yang sama dalam pasangan dan tidak peduli dengan urutan pasangan, jadi jika daftar adalah "A B C", hasilnya seharusnya:

A - B
A - C
B - C

Bagaimana saya bisa melakukan hal yang sama di bash?

Jawaban:


9

Pendekatan paling sederhana tampaknya menggunakan parameter posisi.

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

hmmmm, hanya untuk memperjelas, saya tidak ingin elemen yang sama dalam pasangan dan tidak peduli dengan urutan pasangan, saya telah mengedit pertanyaan saya sekarang
719016

Saya baru saja melihat pergeseran dalam pertanyaan awal Anda. Jawaban yang diperbarui untuk dicocokkan.
jw013

1

Cara lain untuk memikirkan masalah Anda adalah: jika Anda memiliki (i, j) indeks untuk setiap item dalam daftar Anda, Anda hanya akan tertarik pada set item di atas (atau di bawah) diagonal (yaitu, di mana saya & gt; j) .

Jika Anda menginginkan semua kombinasi, maka Anda hanya perlu menguji di mana i! = J.

Saya ingin melakukan hal serupa: menghasilkan semua kemungkinan pemesanan 4 item. For loop bersarang ke kedalaman 4 tidak akan sangat cantik, dan persyaratan elegan tidak muncul di pikiran, tetapi solusi ini memang:

$ 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

-2

buang output ke out standar, pipa untuk mengurutkan -u

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.