Frage Zusammenführen und Sortieren mehrerer Dateien mit "sort"


Ich habe eine Reihe von Text-Logfiles im folgenden Format:

ID          (17 characters)
Timestamp   (14 characters YYYYmmddHHMMSS e.g. "20060210100040" -> 2006/02/10 10:00:40)
Random data (? characters)
end of line

Die Dateien sind bereits nach Zeitstempel sortiert. Ich muss 1 Protokolldatei mit allen Protokollen aus mehreren Protokolldateien erhalten, sortiert nach Zeitstempel. Beachten Sie, dass die Protokolldateien wirklich riesig sind, etwa 3-4G (und es gibt Dutzende von ihnen) Ich habe den folgenden Befehl ausprobiert:

sort -s -m -t '|' -k1n,1n +17 -o data_sort.txt *.TXT

Hier ist, wie ich mit diesem Befehl endete:

-s     : don't bother with tie results
-m     : merge all logs files
-t '|' : there is no | in my logs, so the whole line should be field 1
-k1n,1n: sort on the first field as a numeric value
+17    : the timestamp starts at index 17
-o     : output file

Eigentlich ... es scheitert kläglich. Die Ausgabedatei data_sort.txt ist nur die Verkettung aller Dateien, nicht sortiert :(

Ich würde mich sehr freuen, wenn jemand Hilfe zu diesem Problem geben könnte!

Vielen Dank


4
2018-06-03 13:52


Ursprung


Jede Antwort, die eine Verkettung der Dateien vorschlägt, hat offensichtlich nicht berücksichtigt, dass ihre Größen in GB angegeben sind. - OrangeDog


Antworten:


Dein Schlüssel sollte sein -k1.17n und weglassen die -t und das +17.

Gibt es ein Leerzeichen zwischen der ID und dem Zeitstempel? Dann ist der Zeitstempel Feld 2 und der Schlüssel sollte sein -k2.


4
2018-06-03 15:23



Das Problem ist, dass ein Leerzeichen in der ID vorhanden sein kann, also könnte der Zeitstempel Feld 1 oder Feld 2 sein, deshalb habe ich versucht, es mit Feld 1 zu reparieren -t '|' Trick: / - NewbiZ
@NewbiZ: Dann -k1.17n sollte arbeiten. - Dennis Williamson


man sort liest:

-m, --merge   füge bereits sortierte Dateien zusammen; sortiere nicht

Das '+' - Symbol wird in meiner Manpage nicht zur Sortierung angezeigt. Also ich weiß nicht wie du +17 bekommst. Wenn Sie die ganze Linie benutzen wollen, tun Sie das nicht brauchen -t oder -k, da standardmäßig mit der Sortierung vom Anfang der Zeile bis zum Ende der Zeile begonnen wird.


7
2018-06-03 14:01



-m ist ein bisschen mehrdeutig info coreutils sort states: Verschmelzen Sie die angegebenen Dateien, indem Sie sie als Gruppe sortieren. Jede Eingabedatei muss immer einzeln sortiert werden. Ein Gedanke, dass es lokal sortierte Dateien zusammenführen und sortieren würde. "+" taucht auch nicht in meinem Mann auf, aber ich habe gesehen, wie Leute auf einigen Webseiten nachgesehen haben, und ich habe keine andere Möglichkeit gefunden, wo der Zeitstempel in der Zeile steht - NewbiZ


Ich mag diese harten ... diese hat mich denken lassen:

Im Wesentlichen verkettet es alle TXT-Dateien, trennt sie mit Doppelpunkten (zum Sortieren), sortiert das zweite Feld (das r sortiert das neueste zuerst, nimmt es heraus, wenn Sie zuletzt wollen) und entfernt dann die Doppelpunkte und zeigt die ursprüngliche Zeile .

cat *.txt
 | awk '{print substr($0,1,17)":"substr($0,18,14)":"substr($0,32)}'
 | sort -t: -k2,2 -nr -s
 | tr -d ':'

Ich habe es mit drei 4-Zeilen-TXT-Dateien getestet.

Erste Datei

1234567890123456720100603104500Random text or data
2345678901234567820100602104500New Random Text
3456789012345678920100509213849Earlier Date
4567890123456789020100521195058InBetween Date

Zweite Datei

1234567890123456720100603124500File2 Random text or data
2345678901234567820100602124500File2 New Random Text
3456789012345678920100519213849File2 Earlier Date
4567890123456789020100523195058File2 InBetween Date

Dritte Datei

12345678901234567201106031045003Random text or data
23456789012345678201004021045003New Random Text
34567890123456789201007092138493Earlier Date
45678901234567890201005231950583InBetween Date

Ergebnisse

12345678901234567201106031045003Random text or data
34567890123456789201007092138493Earlier Date
1234567890123456720100603124500File2 Random text or data
1234567890123456720100603104500Random text or data
2345678901234567820100602124500File2 New Random Text
2345678901234567820100602104500New Random Text
4567890123456789020100523195058File2 InBetween Date
45678901234567890201005231950583InBetween Date
4567890123456789020100521195058InBetween Date
3456789012345678920100519213849File2 Earlier Date
3456789012345678920100509213849Earlier Date
23456789012345678201004021045003New Random Text

1
2018-06-03 16:38





Versuchen Sie es mit cat zuerst die Dateien verketten und dann sortieren. sort wird nicht über mehrere Dateien verwechselt, weil es einen einzelnen Eingabestream von stdin kommen sehen wird.

Die Kombination der Optionen, für die Sie verwenden -t und -k Scheint so, als ob du das außerhalb dessen machst, was normalerweise passiert. Sortierung funktioniert bei Feldern mit bestimmten Trennzeichen - standardmäßig Whitespace.

Sie werden wahrscheinlich eine Kombination von cut (Felder nach Byte ausbrechen), awk sie zusammenzuspleißen, sort um die Zeilen zu sortieren und dann awk um die Linien in ihrem ursprünglichen Format neu zu erstellen.


0
2018-06-03 14:28