In einem Bash-Skript möchte ich N zufällige Zeilen aus der Eingabedatei auswählen und in eine andere Datei ausgeben.
Wie kann das gemacht werden?
bash
shell
random
text-processing
user121196
quelle
quelle
sort -R
da es viel überschüssige Arbeit leistet, insbesondere bei langen Dateien. Sie verwenden können$RANDOM
,% wc -l
,jot
,sed -n
(à la stackoverflow.com/a/6022431/563329 ) und bash - Funktionalität (Arrays, Befehl Umleitungen usw.) Ihre eigene definierenpeek
Funktion , die auf 5.000.000 Online-Dateien tatsächlich ausgeführt wird.Antworten:
Verwenden Sie
shuf
mit der-n
Option , wie unten gezeigt, zu erhaltenN
zufällige Linien:quelle
sort -R
?Sortieren Sie die Datei nach dem Zufallsprinzip und wählen Sie die ersten
100
Zeilen aus:quelle
sort
sortiert tatsächlich identische Zeilen zusammen. Wenn Sie also möglicherweise doppelte Zeilen haben undshuf
(ein Gnu-Tool) installiert haben, ist es besser, diese zu verwenden.shuf -n
ziemlich sofort geschieht .sort -R
ist wahrscheinlich GNU Option, installieren Sie GNU Coreutils. Übrigensshuf
ist auch ein Teil von Coreutils.sort -R input | head -n <num_lines>
. Die Eingabedatei war 279 GB groß und hatte mehr als 2 Zeilen. Kann es aber nicht teilen. Der Punkt ist jedenfalls, dass Sie einige Zeilen mit Shuffle im Speicher behalten können, um die zufällige Auswahl der Ausgabe zu treffen. Durch Sortieren wird die gesamte Datei sortiert , unabhängig von Ihren Anforderungen.Nach einem Kommentar zur Shuf-Antwort mischte er 78 000 000 000 Zeilen in weniger als einer Minute.
Herausforderung angenommen...
Zuerst brauchte ich eine Datei mit 78.000.000.000 Zeilen:
Das gibt mir eine Datei mit 78 Milliarden Zeilenumbrüchen ;-)
Nun zum Shuf-Teil:
Der Engpass war die CPU, die nicht mehrere Threads verwendete. Sie steckte 1 Kern zu 100% fest, die anderen 15 wurden nicht verwendet.
Python ist das, was ich regelmäßig benutze, also werde ich es verwenden, um dies schneller zu machen:
Das brachte mich knapp eine Minute:
Ich habe dies auf einem Lenovo X1 extreme 2. Generation mit dem i9 und Samsung NVMe gemacht, was mir viel Lese- und Schreibgeschwindigkeit gibt.
Ich weiß, dass es schneller werden kann, aber ich werde etwas Raum lassen, um andere auszuprobieren.
Zeilenzählerquelle : Luther Blissett
quelle