2017-11-08 1 views
0

Ich versuche ein Shell-Skript zu schreiben, das drei Listen von Namen enthält und jede Kombination aus den Listen erstellt und jede Liste könnte eine andere Anzahl von Namen haben.Shell Scripting, drei Arten von Namen, jede Kombination

Liste 1
Mike
Tom
Harry
Steve

Liste 2
Deborah
Sarah
Jennifer

Liste 3
Alex
Joe
Kelly
Amanda
Will
Phillip
David

Es Mike 1 aus der Liste nehmen und dann Deborah aus der Liste 2 dann die Namen aller aus der Liste Liste 3. Dann Mike aus der Liste 1 wieder, Sarah aus Liste 2, dann alle Namen aus Liste 3 usw., bis sie mit jeder möglichen Kombination auftauchen.

Mit einigen Schwierigkeiten zu denken, wie ich dies und jede Hilfe erreichen würde geschätzt werden.

+2

Was hast du probiert? Welche Fehler bekommst du? Wo sind die Listen gespeichert? –

Antwort

1

Sie können die for-Schleife verwenden. Seien f1, f2 und f3 die Dateien, die die drei Listen enthalten. Dann:

for a in `cat f1`;do 
for b in `cat f2`;do 
    for c in `cat f3`;do 
    echo $a $b $c; 
    done; 
done; 
done 

Zum Beispiel:

$ cat f1 
red 
green 
cat 

$ cat f2 
rice 
bread 
cat f 

$ cat f3 
tomato 
onion 


$ for a in `cat f1`;do for b in `cat f2`;do for c in `cat f3`;do echo $a $b $c; done; done; done 
red rice tomato 
red rice onion 
red bread tomato 
red bread onion 
green rice tomato 
green rice onion 
green bread tomato 
+0

Das hat perfekt funktioniert. Wählen Sie dieses speziell, da ich For-Schleifen zuvor verwendet habe, also habe ich es verstanden. – nbucko

1

Je nachdem, wie Sie list x gespeichert sind, können Sie einfach Klammer Expansion permutieren alle drei Listen zusammen, zB:

printf "%s\n" {Mike,Tom,Harry,Steve}\ 
{Deborah,Sarah,Jennifer}\ 
{Alex,Joe,Kelly,Amanda,Will,Phillip,David} 

Beispiel Verwendung/Ausgabe

$ bash brexpperm.sh 
MikeDeborahAlex 
MikeDeborahJoe 
MikeDeborahKelly 
MikeDeborahAmanda 
MikeDeborahWill 
MikeDeborahPhillip 
MikeDeborahDavid 
MikeSarahAlex 
MikeSarahJoe 
MikeSarahKelly 
MikeSarahAmanda 
MikeSarahWill 
MikeSarahPhillip 
MikeSarahDavid 
MikeJenniferAlex 
MikeJenniferJoe 
MikeJenniferKelly 
MikeJenniferAmanda 
MikeJenniferWill 
MikeJenniferPhillip 
MikeJenniferDavid 
TomDeborahAlex 
TomDeborahJoe 
TomDeborahKelly 
TomDeborahAmanda 
TomDeborahWill 
TomDeborahPhillip 
TomDeborahDavid 
TomSarahAlex 
TomSarahJoe 
TomSarahKelly 
TomSarahAmanda 
TomSarahWill 
TomSarahPhillip 
TomSarahDavid 
TomJenniferAlex 
TomJenniferJoe 
TomJenniferKelly 
TomJenniferAmanda 
TomJenniferWill 
TomJenniferPhillip 
TomJenniferDavid 
HarryDeborahAlex 
HarryDeborahJoe 
HarryDeborahKelly 
HarryDeborahAmanda 
HarryDeborahWill 
HarryDeborahPhillip 
HarryDeborahDavid 
HarrySarahAlex 
HarrySarahJoe 
HarrySarahKelly 
HarrySarahAmanda 
HarrySarahWill 
HarrySarahPhillip 
HarrySarahDavid 
HarryJenniferAlex 
HarryJenniferJoe 
HarryJenniferKelly 
HarryJenniferAmanda 
HarryJenniferWill 
HarryJenniferPhillip 
HarryJenniferDavid 
SteveDeborahAlex 
SteveDeborahJoe 
SteveDeborahKelly 
SteveDeborahAmanda 
SteveDeborahWill 
SteveDeborahPhillip 
SteveDeborahDavid 
SteveSarahAlex 
SteveSarahJoe 
SteveSarahKelly 
SteveSarahAmanda 
SteveSarahWill 
SteveSarahPhillip 
SteveSarahDavid 
SteveJenniferAlex 
SteveJenniferJoe 
SteveJenniferKelly 
SteveJenniferAmanda 
SteveJenniferWill 
SteveJenniferPhillip 
SteveJenniferDavid 

Oder, wenn Sie einen Raum benötigen, können Sie einfach einen zur Erweiterung hinzufügen:

printf "%s\n" {'Mike ','Tom ','Harry ','Steve '}\ 
{'Deborah ','Sarah ','Jennifer '}\ 
{Alex,Joe,Kelly,Amanda,Will,Phillip,David} 

Beispiel Verwendung/Output

$ bash brexpperm.sh 
Mike Deborah Alex 
Mike Deborah Joe 
Mike Deborah Kelly 
Mike Deborah Amanda 
... 
Steve Jennifer Amanda 
Steve Jennifer Will 
Steve Jennifer Phillip 
Steve Jennifer David 

Wenn Sie haben keine Kontrolle über die Listen in Ihrem Skript selbst, dann funktioniert eine Loop-Lösung gut.