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.