Ich habe mehrere (viele) Dateien; jeweils sehr groß:
%Vor%Ich möchte sie nicht zu einer einzigen Datei zusammenfügen, da die resultierende Datei 10+ Gigs sein würde. Jede Zeile in jeder Datei enthält eine 40-Byte-Zeichenfolge. Die Saiten sind jetzt ziemlich gut geordnet (etwa 1:10 Schritte ist eine Abnahme des Wertes anstelle einer Erhöhung).
Ich hätte gerne die Linien bestellt. (In-Place, wenn möglich?) Dies bedeutet, dass einige der Zeilen vom Ende von file0.txt
an den Anfang von file1.txt
verschoben werden und umgekehrt.
Ich arbeite an Linux und ziemlich neu daran. Ich kenne den Befehl sort
für eine einzelne Datei, frage mich aber, ob es eine Möglichkeit gibt, mehrere Dateien zu sortieren. Oder vielleicht gibt es eine Möglichkeit, eine Pseudo-Datei aus kleineren Dateien zu erstellen, die Linux als eine einzige Datei behandelt.
Was ich weiß kann tun:
Ich kann jede Datei einzeln sortieren und in file1.txt
einlesen, um den Wert größer als den größten in file0.txt
zu finden (und in ähnlicher Weise die Zeilen vom Ende von file0.txt
zu nehmen), beitreten und dann sortieren .. aber das ist ein Schmerz und nimmt an, dass keine Werte von file2.txt
in file0.txt
gehören (in meinem Fall jedoch sehr unwahrscheinlich)
Um klar zu sein, wenn die Dateien so aussehen:
%Vor%Ich will das:
%Vor%Ich weiß nichts über einen Befehl, der die In-Place-Sortierung durchführt, aber ich denke, ein schnelleres "merge sort" ist möglich:
%Vor%sort
in der for-Schleife stellt sicher, dass der Inhalt der Eingabedateien sortiert ist. Wenn Sie das Original nicht überschreiben möchten, ändern Sie einfach den Wert nach dem Parameter -o
. (Wenn Sie erwarten, dass die Dateien bereits sortiert sind, können Sie die Sortieranweisung in "Nur prüfen" ändern: sort -c $file || exit 1
) sort
führt ein effizientes Zusammenführen der Eingabedateien durch, während die Ausgabe sortiert bleibt. split
weitergeleitet, der dann in Suffix-Ausgabedateien schreibt. Beachten Sie das -
-Zeichen; Dies teilt split das Lesen von der Standardeingabe (d. h. der Pipe) anstelle einer Datei mit. Hier ist auch eine kurze Zusammenfassung der Funktionsweise der Zusammenführungssortierung:
sort
liest eine Zeile aus jeder Datei. Es ist nicht genau das, wonach Sie gefragt haben, aber das Dienstprogramm sort(1)
kann Ihnen ein wenig helfen, indem Sie die Option --merge
verwenden. Sortieren Sie jede Datei einzeln und sortieren Sie den resultierenden Dateistapel:
(Das sind 100.000 Zeilen pro Ausgabedatei. Vielleicht ist das immer noch viel zu klein.)
Ich glaube, dass dies die beste Wahl ist, wenn Sie Linux-Utilities verwenden:
Sortieren Sie jede Datei einzeln, z. for f in file*.txt; do sort $f > sorted_$f.txt; done
Sortiere alles mit sort -m sorted_file*.txt | split -d -l <lines> - <prefix>
, wobei <lines>
die Anzahl der Zeilen pro Datei ist und <prefix>
das Präfix der Datei. (Der -d
teilt Split mit, dass numerische Suffixe verwendet werden sollen.)
Die zu sortierende -m
-Option gibt an, dass die Eingabedateien bereits sortiert sind, sodass sie intelligent sein kann.