Verwenden von GNU Sort mit mehreren Schlüsseln, Text und Zahlen

Verwenden von GNU Sort mit mehreren Schlüsseln, Text und Zahlen

Ich habe einige Mail-Log-Auszüge, die ich zunächst nach E-Mail-Adresse und dann nach Datum sortieren möchte.

Beispiel-Eingabedaten:

$ cat test3.txt
Oct 10 14:00:00 [email protected] bounced
Oct 10 13:00:00 [email protected] deferred
Oct 10 14:30:00 [email protected] bounced
Oct 10 12:00:00 [email protected] deferred
Oct 9 12:00:00 [email protected] deferred
Oct 9 14:00:00 [email protected] bounced
Oct 10 12:30:00 [email protected] deferred
Oct 10 13:30:00 [email protected] deferred
Oct 9 13:00:00 [email protected] deferred

Die Datei in ihrer aktuellen Version ist durch Leerzeichen getrennt. Ich möchte also zuerst nach der vierten Spalte sortieren und dann nach der ersten (als Monat), zweiten (numerisch) und dritten (numerisch, nehme ich an, es sei denn, die Zeitstempel erfordern eine spezielle Behandlung.) Dies ist mein bester Versuch:

$ sort -k 4,4 -k 1,1M -nk 2 test3.txt
Oct 9 12:00:00 [email protected] deferred
Oct 9 13:00:00 [email protected] deferred
Oct 9 14:00:00 [email protected] bounced
Oct 10 12:00:00 [email protected] deferred
Oct 10 12:30:00 [email protected] deferred
Oct 10 13:00:00 [email protected] deferred
Oct 10 13:30:00 [email protected] deferred
Oct 10 14:00:00 [email protected] bounced
Oct 10 14:30:00 [email protected] bounced

Wenn ich nur das Schlüsselargument „-k 4,4“ einschließe, erfolgt die Sortierung gemäß der E-Mail einwandfrei, aber dies scheint ignoriert zu werden, wenn ich die anderen Schlüssel hinzufüge. Der Einfachheit halber kann die erste Spalte in diesem Beispiel ignoriert werden; das Problem besteht weiterhin, da die Sortierung nach der zweiten Spalte Vorrang vor der vierten hat.

Was mache ich falsch?

Antwort1

Im Zweifelsfall verwenden Sie --debugdie Flagge:

xb@dnxb:/tmp$ sort -k 4,4 -k 1,1M -nk 2 test3.txt --debug
sort: using ‘en_SG.UTF-8’ sorting rules
sort: key 3 is numeric and spans multiple fields
Oct 9 12:00:00 [email protected] deferred
               ^ no match for key
___
    _
_________________________________________
Oct 9 13:00:00 [email protected] deferred
               ^ no match for key
___
    _
_________________________________________
Oct 9 14:00:00 [email protected] bounced
               ^ no match for key
___
    _
________________________________________

Das sollte funktionieren:

xb@dnxb:/tmp$ sort -b -k4,4 -k1M -k2n -k3n test3.txt --debug
sort: using ‘en_SG.UTF-8’ sorting rules
sort: key 3 is numeric and spans multiple fields
sort: key 4 is numeric and spans multiple fields
Oct 10 12:00:00 [email protected] deferred
                ________________
___
    __
       __
_________________________________________
Oct 10 13:00:00 [email protected] deferred
                ________________
___
    __
       __
_________________________________________

...

xb@dnxb:/tmp$ sort -b -k4,4 -k1M -k2n -k3n test3.txt
Oct 10 12:00:00 [email protected] deferred
Oct 10 13:00:00 [email protected] deferred
Oct 10 14:00:00 [email protected] bounced
Oct 10 12:30:00 [email protected] deferred
Oct 10 13:30:00 [email protected] deferred
Oct 10 14:30:00 [email protected] bounced
Oct 9 12:00:00 [email protected] deferred
Oct 9 13:00:00 [email protected] deferred
Oct 9 14:00:00 [email protected] bounced
xb@dnxb:/tmp$ 

Sie -nk 2liegen falsch, wie info sortgesagt:

A position in a sort field specified with ‘-k’ may have any of the
option letters ‘MbdfghinRrV’ appended to it, in which case no global
ordering options are inherited by that particular field.

AlsoOptionsbriefe nanhängen soll kund dessenPositionAuf die Reihenfolge kommt es an.

verwandte Informationen