Diese Frage hängt stark mit dieser und dieser Frage zusammen. Ich habe eine Datei, die mehrere Zeilen enthält, wobei jede Zeile ein Pfad zu einer Datei ist. Jetzt möchte ich jede Zeile mit jeder anderen Zeile (nicht selbst) koppeln. Auch ein Paar A B
ist B A
für meine Zwecke gleich einem Paar, daher sollte nur eine dieser Kombinationen hergestellt werden.
Beispiel
files.dat
liest sich so in einer Kurzschreibweise, jeder Buchstabe ist ein Dateipfad (absolut oder relativ)
a
b
c
d
e
Dann sollte mein Ergebnis ungefähr so aussehen:
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
Am liebsten möchte ich das in bash lösen. Im Gegensatz zu den anderen Fragen ist meine Dateiliste eher klein (ca. 200 Zeilen), sodass die Verwendung von Schleifen und RAM-Kapazität keine Probleme darstellt.
Antworten:
Verwenden Sie diesen Befehl:
PROCINFO
kann einegawk
Erweiterung sein. Wenn Sieawk
dies nicht unterstützen, lassen Sie einfach diePROCINFO["sorted_in"] = "@ind_str_asc"
Zeile weg und leiten Sie die Ausgabe weitersort
(wenn Sie die Ausgabe sortieren möchten).(Dies gilt nicht erfordert die Eingabe sortiert werden.)
quelle
Dies setzt voraus, dass keine Zeile in der Eingabedatei Leerzeichen enthält. Es wird auch davon ausgegangen, dass die Datei sortiert ist .
Der
join
Befehl erstellt das vollständige Kreuzprodukt der Zeilen in der Datei. Dazu wird die Datei in einem nicht vorhandenen Feld mit sich selbst verbunden. Der Nicht-Standard-j 2
kann durch ersetzt werden-1 2 -2 2
(jedoch nicht durch, es-j2
sei denn, Sie verwenden GNUjoin
).Der
awk
Befehl liest das Ergebnis und gibt nur Ergebnisse aus, bei denen es sich um Paare handelt, die noch nicht gesehen wurden.quelle
sort -b
Art und Weise würde es sortieren.join
erfordern sortierte Eingabedateien.Eine
python
Lösung. Die Eingabedatei wirditertools.combinations
aus der Standardbibliothek eingespeist , die Tupel mit 2 Längen generiert, die formatiert und in der Standardausgabe gedruckt werden.quelle
Wenn Sie
ruby
installiert haben:-0777
Schlürfen Sie die gesamte Datei (sollte in Ordnung sein, da in OP erwähnt wird, dass die Dateigröße klein ist).-F'\n'
Auf der Grundlage der neuen Zeile wird aufgeteilt, sodass jede Zeile ein Element im$F
Array ist$F.combination(2)
Generieren Sie Kombinationselemente2
gleichzeitig{ |c| puts c.join(" ")}
nach Bedarf drucken$F.uniq.combination(2)
für 3 Elemente gleichzeitig:
Mit
perl
(nicht generisch)Mit
awk
quelle
Hier ist einer in reiner Schale.
Beispiel:
quelle
<file.dat xargs test.sh
alstest.sh $(cat file.dat)
Mit
Perl
können wir es wie gezeigt machen:quelle