Ich habe möglicherweise große Dateien, die nach 1-n-Schlüsseln sortiert werden müssen. Einige dieser Tasten sind möglicherweise numerisch, andere möglicherweise nicht. Dies ist eine Säulendatei mit fester Breite, daher gibt es keine Trennzeichen.
Gibt es eine gute Möglichkeit, dies mit Unix sort zu tun? Mit einem Schlüssel ist es so einfach wie mit '-n'. Ich habe die Manpage gelesen und kurz bei Google gesucht, aber kein gutes Beispiel gefunden. Wie würde ich vorgehen, um dies zu erreichen?
Hinweis: Ich habe Perl aufgrund des Potenzials der Dateigröße ausgeschlossen. Es wäre ein letzter Ausweg.
Antworten:
Verwenden Sie die
-k
Option (oder--key=POS1[,POS2]
). Es kann mehrmals angezeigt werden und jeder Schlüssel kann globale Optionen haben (z. B.n
für die numerische Sortierung).quelle
Pass aber auf:
Wenn Sie die Datei hauptsächlich nach Feld 3 und sekundär nach Feld 2 sortieren möchten, möchten Sie Folgendes:
Nicht dies:
sort -k 3 -k 2 < inputfile
Hiermit wird die Datei nach der Zeichenfolge vom Anfang von Feld 3 bis zum Zeilenende sortiert (was möglicherweise eindeutig ist).quelle
sort -k 3,3nr -k 2,2
-k2
sollte sein-k2,2
und ein nachfolgendes Komma-k2,
sollte "magisches Standardzeilenende oder was auch immer" sein.Die Option -k ist genau das, was Sie wollen.
Würde die Zeichenpositionen 4-5 im ersten Feld verwenden (es ist alles ein Feld für feste Breite) und numerisch als ersten Schlüssel sortieren.
Der zweite Schlüssel wären auch die Zeichen 14-15 im ersten Feld.
(bearbeiten)
Beispiel (alles was ich habe ist DOS / Cygwin praktisch):
für die Daten:
Sortiert die Verzeichnisliste numerisch nach Monatsnummer (Pos. 4-5) und umgekehrt nach Dateiname (Pos. 40-60). Da es keine Registerkarten gibt, muss Feld 1 sortiert werden.
quelle
Hier ist eine, um verschiedene Spalten in einer CSV-Datei nach numerischer und Wörterbuchreihenfolge, Spalten 5 und danach als Wörterbuchreihenfolge zu sortieren
Beachten Sie, dass -k1,1n numerisch bedeutet, beginnend mit Spalte 1 und endend mit Spalte 1. Wenn ich es unten getan hätte, hätte es Spalte 1 und 2 verkettet und 1,10 als 110 sortiert
quelle
Ich glaube an deinen Fall so etwas wie
wird besser funktionieren. @ ist das Feldtrennzeichen. Stellen Sie sicher, dass es sich um ein Zeichen handelt, das nirgendwo erscheint. dann wird Ihre Eingabe als aus einer Spalte bestehend betrachtet.
Edit: anscheinend hat clintp schon eine ähnliche antwort gegeben, sorry. Wie er betont, können die Flags 'n' und 'r' zu jeder Option -k .... hinzugefügt werden.
quelle
Es ist zu beachten, dass dies auch erwünscht sein kann, um die Sortierung mit dem
-s
Schalter zu stabilisieren , so dass gleichrangige Linien auch in der Ausgabe ihre ursprüngliche relative Reihenfolge beibehalten.quelle
Ich möchte nur einige Tipps hinzufügen. Wenn Sie sort verwenden, achten Sie auf Ihr Gebietsschema, das sich auf die Reihenfolge des Schlüsselvergleichs auswirkt. Normalerweise verwende ich explizit LC_ALL = C, um das Gebietsschema so zu gestalten, wie ich es möchte.
quelle