Ich habe zwei satzausgerichtete parallele Korpora (Textdateien) mit ungefähr 50 Millionen Wörtern. (aus dem Europarl-Korpus -> Parallelübersetzung von Rechtsdokumenten). Ich möchte jetzt die Zeilen der beiden Dateien mischen, aber beide auf die gleiche Weise. Ich wollte das mit gshuf (ich bin auf einem Mac) mit einer einzigen zufälligen Quelle erreichen.
gshuf --random-source /path/to/some/random/data file1
gshuf --random-source /path/to/some/random/data file2
Aber ich habe die Fehlermeldung erhalten end of file
, weil anscheinend der zufällige Startwert alle Wörter enthalten muss, die die zu sortierende Datei enthält. Ist das wahr? Wenn ja, wie soll ich einen zufälligen Startwert erstellen, der meinen Anforderungen entspricht? Wenn nein, auf welche andere Weise könnte ich die Dateien parallel randomisieren? Ich dachte daran, sie zusammenzufügen, zufällig zu sortieren und dann wieder aufzuteilen. Dies scheint jedoch hässlich zu sein, da ich zuerst ein Trennzeichen finden müsste, das in den Dateien nicht vorkommt.
quelle
random sources
. Waspaste
Sie als Trennzeichen einig niedrigen ASCII - Zeichen verwenden könnten , die in den Dateien (wie das Auftreten unwahrscheinlich sind\x02
,\x03
...).Antworten:
Ich weiß nicht, ob es eine elegantere Methode gibt, aber das funktioniert bei mir:
Ergebnis:
Die Dateien müssen jedoch genau die gleiche Anzahl von Zeilen haben.
Die Dokumentation zu GNU Coreutils bietet auch eine gute Lösung für wiederholte Zufälligkeiten, die
openssl
als Startgenerator verwendet werden:Verwenden Sie jedoch einen besseren Startwert als "42", es sei denn, Sie möchten, dass auch andere Personen "Ihr" zufälliges Ergebnis reproduzieren können.
quelle
end of file
Fehler nicht auftritt?/dev/null
liegt daran, dasstee
auch gedruckt wirdstdout
. Könnte> threerandom
stattdessen verwenden, aber es ist schwieriger zu skripten. Die genannten Pipes erzeugen so viele zufällige Daten wie nötig, sodass Sie nicht vorher wissen müssen, wie viel Sie benötigen.tee
macht ...