it-swarm.com.de

Sortieren mehrerer Schlüssel mit der Unix-Sortierung

Ich habe möglicherweise große Dateien, die nach 1-n-Schlüsseln sortiert werden müssen. Einige dieser Tasten sind möglicherweise numerisch und andere nicht. Dies ist eine Spaltendatei mit fester Breite, daher gibt es keine Begrenzer.

Gibt es eine gute Möglichkeit, dies mit Unix zu tun? Mit einem Schlüssel ist es so einfach wie mit '-n'. Ich habe die Manpage gelesen und kurz in Google gesucht, aber kein gutes Beispiel gefunden. Wie würde ich vorgehen, um dies zu erreichen?

Hinweis: Ich habe Perl aufgrund der möglichen Dateigröße ausgeschlossen. Es wäre ein letzter Ausweg.

128

Verwenden Sie die -k Option (oder --key=POS1[,POS2]). Es kann mehrmals vorkommen und jeder Schlüssel kann globale Optionen haben (z. B. n für numerische Sortierung).

68
Ken Gentle

Pass auf dich auf:

Wenn Sie die Datei primär nach Feld 3 und sekundär nach Feld 2 sortieren möchten, möchten Sie dies nicht:

sort -k 3 -k 2 < inputfile

du willst das stattdessen:

sort -k 3,3 -k 2,2 < inputfile

Der erste sortiert die Datei nach der Zeichenfolge vom Anfang von Feld 3 bis zum Ende der Zeile (was möglicherweise eindeutig ist).

-k, --key=POS1[,POS2]     start a key at POS1 (Origin 1), end it at POS2
                          (default end of line)
298
andras

Die Option -k ist das, was Sie wollen.

-k 1.4,1.5n -k 1.14,1.15n

Würde die Zeichenpositionen 4-5 im ersten Feld verwenden (es ist alles ein Feld für eine 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):

dir | \cygwin\bin\sort.exe -k 1.4,1.5n -k 1.40,1.60r

für die Daten:

12/10/2008  01:10 PM         1,564,990 outfile.txt

Sortiert die Verzeichnisliste numerisch nach der Monatsnummer (Pos. 4-5) und umgekehrt nach dem Dateinamen (Pos. 40-60). Da es keine Registerkarten gibt, muss nur Feld 1 sortiert werden.

92
Clinton Pierce

Hier ist eine, um verschiedene Spalten in einer CSV-Datei nach numerischer und Wörterbuchreihenfolge zu sortieren, Spalten 5 und danach als Wörterbuchreihenfolge

~/test>sort -t, -k1,1n -k2,2n -k3,3d -k4,4n -k5d  sort.csv
1,10,b,22,Ga
2,2,b,20,F
2,2,b,22,Ga
2,2,c,19,Ga
2,2,c,19,Gb,hi
2,2,c,19,Gb,hj
2,3,a,9,C

~/test>cat sort.csv
2,3,a,9,C
2,2,b,20,F
2,2,c,19,Gb,hj
2,2,c,19,Gb,hi
2,2,c,19,Ga
2,2,b,22,Ga
1,10,b,22,Ga

Beachten Sie, dass -k1,1n numerisch ist und bei Spalte 1 beginnt und bei Spalte 1 endet. Wenn ich das unten getan hätte, hätte es die Spalten 1 und 2 verkettet und 1,10 als 110 sortiert

~/test>sort -t, -k1,2n -k3,3 -k4,4n -k5d  sort.csv
2,2,b,20,F
2,2,b,22,Ga
2,2,c,19,Ga
2,2,c,19,Gb,hi
2,2,c,19,Gb,hj
2,3,a,9,C
1,10,b,22,Ga
21
edW

Ich glaube in deinem Fall sowas

sort [email protected] -k1.1,1.4 -k1.5,1.7 ... <inputfile

wird besser funktionieren. @ ist das Feldtrennzeichen. Vergewissern Sie sich, 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 -k .... -Option hinzugefügt werden.

11
Dong Hoon

Beachten Sie, dass möglicherweise auch gewünscht wird, um die Sortierung mit dem Schalter -s Zu stabilisieren, damit gleichrangige Zeilen auch in der Ausgabe ihre ursprüngliche relative Reihenfolge beibehalten.

5
ron

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 LC_ALL = C explizit, um das Gebietsschema so festzulegen, wie ich es möchte.

2
jianpx