über mehrere Dateien in Linux sortieren

7

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)

Bearbeiten

Um klar zu sein, wenn die Dateien so aussehen:

%Vor%

Ich will das:

%Vor%     
Paul 07.10.2011, 22:53
quelle

5 Antworten

15

Ich weiß nichts über einen Befehl, der die In-Place-Sortierung durchführt, aber ich denke, ein schnelleres "merge sort" ist möglich:

%Vor%
  • Das 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 )
  • Das zweite sort führt ein effizientes Zusammenführen der Eingabedateien durch, während die Ausgabe sortiert bleibt.
  • Dies wird an den Befehl 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:

  1. sort liest eine Zeile aus jeder Datei.
  2. Er sortiert diese Zeilen und wählt die aus, die zuerst kommen soll. Diese Zeile wird an die Ausgabe gesendet, und eine neue Zeile wird aus der Datei gelesen, die diese Zeile enthält.
  3. Wiederholen Sie Schritt 2, bis keine weiteren Zeilen in einer Datei vorhanden sind.
  4. Zu diesem Zeitpunkt sollte die Ausgabe eine perfekt sortierte Datei sein.
  5. Gewinn!
JBert 07.10.2011, 23:15
quelle
5

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:

%Vor%

(Das sind 100.000 Zeilen pro Ausgabedatei. Vielleicht ist das immer noch viel zu klein.)

    
sarnold 07.10.2011 23:09
quelle
3

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.

    
Cascabel 07.10.2011 23:07
quelle
2

mmap () die 3 Dateien, da alle Zeilen 40 Bytes lang sind, können Sie sie leicht an Ort und Stelle sortieren (SIP :-). Vergessen Sie nicht die msync am Ende.

    
ott-- 07.10.2011 23:16
quelle
1

Wenn die Dateien einzeln sortiert sind, können Sie sort -m file*.txt verwenden, um sie zusammenzuführen - lesen Sie die erste Zeile jeder Datei, geben Sie die kleinste aus und wiederholen Sie sie.

    
evil otto 07.10.2011 23:07
quelle

Tags und Links