Wie mischt man große Textdateien effizient und leitet sie unter Linux?

1792
yarun can

Ich habe eine Textdatei, die paar GBs ist. Ich versuche, diese Textdatei in einer Pipe zu mischen.

Dies sind zum Beispiel einige Beispielzeilen von dem, was ich verwende, aber es ist nicht effizient und tatsächlich scheint die Pipe nicht zu starten, bis die gesamte Datei gelesen ist. Vielleicht habe ich mich geirrt.

shuf HUGETEXTFILE.txt|some command  cat HUGETEXTFILE.txt|sort -R |some command 

Ich habe auch versucht zu benutzen

split -n 1/numberofchunks HUGETEXTFILE.txt|sort -R|some command 

Das Pfeifen endet jedoch, wenn der erste Teil fertig ist.

Ich versuche, einen effizienten Weg zum Pipe-Mischen von Textdateien in einer Pipe zu finden, weil ich nicht jedes Mal Hunderte von Dateien schreiben möchte, wenn ich einen neuen Weg zum Mischen oder eine zufällige Verteilung benötige.

Vielen Dank

0
Haben Sie versucht, "shuf --input-range = $ LO- $ HI" zu verwenden? Anstelle von "split ..." können Sie "shuf" das Sortiment in Leinensummen geben ... Hastur vor 9 Jahren 0
Nun, ich versuche, wenn möglich, die gesamte Datei auf einmal zu mischen. Das klingt einfach so, als würde es einen Bereich aus der Eingabedatei mischen. yarun can vor 9 Jahren 0
Auch dieses Argument erzeugt nur eine Reihe von Zufallszahlen. Ich bin mir nicht sicher, ob ich das brauche. Können Sie bitte ausführlicher sein? yarun can vor 9 Jahren 0
Haben Sie versucht, shuf mit der Option --output zu verwenden, dann cat outfile.txt | ein Befehl Ich weiß, Sie sagten, Sie wollten nicht Hunderte von Dateien schreiben, aber dies ist nur eine, und der Name kann neu geschrieben werden, was bedeutet, dass Sie nur eine haben sollten. Tyson vor 9 Jahren 0
Sie wissen, dass es einfach keine "effiziente" Möglichkeit gibt, eine Multi-GB-Textdatei zu mischen (dh eine, die nicht in den Arbeitsspeicher passt). Das Mischen ist ein sehr teurer Vorgang. Eugen Rieck vor 9 Jahren 0
@Eugen Rieck, es macht mir nichts aus, wenn es in einer Skriptlösung auf mehrere Arten aufgeteilt ist. Ich möchte einfach nicht mit vielen hundert Dateien umgehen, wenn möglich. yarun can vor 9 Jahren 0

1 Antwort auf die Frage

0
Ruslan Gerasimov

Sie können diesen Ansatz ausprobieren:

cat bigfile.txt| while IFS= read -r line; do echo '%s\n' "$line" |shuf |sort -n| grep "sample"; done 

IFS wird verwendet, um die Ausgabe hier in Zeilen aufzuteilen.