2008-12-10 20 views
113

Ich habe möglicherweise große Dateien, die nach 1-n-Tasten sortiert werden müssen. Einige dieser Schlüssel können numerisch sein und einige von ihnen sind möglicherweise nicht numerisch. Dies ist eine säulenförmige Datei mit fester Breite, daher gibt es keine Trennzeichen.Sortierung mehrerer Schlüssel mit Unix-Sortierung

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

Hinweis: Ich habe Perl aufgrund des Dateigrößenpotenzials ausgeschlossen. Es wäre ein letzter Ausweg.

+0

Eine oder zwei Zeilen von beispiel~~POS=TRUNC wären wirklich hilfreich zum Beispiel Befehlszeile zu erstellen. Bedeutet "1-n" auch, dass Sie nach einer variablen Anzahl von Schlüsseln sortieren müssen? Das ohne Scripting zu tun, wird Spaß machen ... –

+0

Ich habe einen PHP-Wrapper um den sort-Befehl, um die 1-n-Funktion zu aktivieren. –

Antwort

56

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

+6

Von der Sortiermanpage: "POS ist F [.C] [OPT], wobei F die Feldnummer und C die Zeichenposition im Feld ist; beide sind Ursprung 1." Eine vollständige Dokumentation finden Sie auf der Manpage. –

+37

Siehe auch die Antwort von Andras, wenn du nicht verrückt werden willst. – ron

+1

Beide obigen Kommentare sind genau und additiv. Danke, meine Herren. –

85

Die Option -k ist was Sie wollen.

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

Würde Charakter Gebrauchspositionen 4-5 in dem ersten Feld (es ist ein Feld für alles feste Breite) und zu sortieren numerisch als der ersten Schlüssel.

Der zweite Schlüssel wäre auch die Zeichen 14-15 im ersten Feld.

(edit)

Beispiel (alles, was ich habe, ist DOS/Cygwin praktisch):

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 

Sortierungen die Verzeichnisliste für Monat Nummer (pos 4-5) numerisch und dann nach Dateiname (Pos. 40-60) in umgekehrter Reihenfolge. Da es keine Tabs gibt, ist alles Feld 1 zu sortieren.

+0

Es ist nur ein Feld, wenn in den Eingabedaten keine Leerzeichen enthalten sind. Trotzdem ist Ihr Beispiel nützlich. –

+0

Korrektur: wenn keine/tabs/in den Eingabedaten vorhanden sind. In DOS 'dir' Befehlsausgabe gibt es keine Registerkarten. –

+0

Die Beispiele zur Verwendung der Optionen (numerisch, rückwärts) sind sehr hilfreich, da es fast unmöglich ist, herauszufinden, wie man es nur von der Manpage aus benutzt und die anderen Antworten erwähnen es nicht. Ich wünschte, ich könnte +2 dafür. ;) – msb

10

Ich glaube, in Ihrem Fall so etwas wie

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

besser funktionieren wird. @ ist das Feldtrennzeichen, stellen Sie sicher, dass es ein Zeichen ist, das nirgends erscheint. dann wird Ihre Eingabe als aus einer Spalte bestehend betrachtet.

Edit: anscheinend clintp gab bereits eine ähnliche Antwort, sorry. Wie er hervorhebt, können die Flags 'n' und 'r' zu jeder -k .... -Option hinzugefügt werden.

262

Achten Sie darauf, wenn:

Wenn Sie die Datei in erster Linie durch das Feld 3, sortiert werden soll und in zweiter Linie durch Feld 2 Sie dies nicht wollen:

sort -k 3 -k 2 < inputfile 

Sie wollen, dass diese statt:

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

-k, --key=POS1[,POS2]  start a key at POS1 (origin 1), end it at POS2 
          (default end of line) 
+19

Das ist ziemlich wichtig, danke! – ron

+6

Leben verändert sich. Vielen Dank. – notJim

+2

Hoppla! Jetzt muss ich ein Skript korrigieren, weil ich früher nur die erste Antwort oben gesehen habe ... gute Sache, dass ich noch nicht von der Skript-Ausgabe abhängig war ... – Wildcard

5

anzumerken, dass auch erwünscht sein wird, kann die Art des -s Schalter zu stabilisieren, so dass gleichrangigen Linien ihre ursprüngliche relative Ordnung in dem Ausgang zu halten.

2

Ich möchte nur einige Tipps hinzufügen, wenn Sie sort verwenden, seien Sie vorsichtig mit Ihrem Gebietsschema, das die Reihenfolge des Schlüsselvergleichs beeinflusst. Normalerweise verwende ich explizit LC_ALL = C, um das Gebietsschema so zu gestalten, wie ich es möchte.

+0

LC_ALL = C kann auch zu einer Beschleunigung führen! –

16

Hier ist man verschiedene Spalten in einer CSV-Datei durch numerische und lexikalische Reihenfolge, Spalten 5 und nach als Wörterbuch, um

~/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 

Notierten die -k1,1n bedeutet numerischen Start in Spalte 1 und endend sortieren auf Spalte 1 Wenn ich unten getan hätte, wäre es hat verkettete Spalte 1 und 2 machen 1,10 sortierte als 110

~/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 
+1

Dies ist die beste Antwort, da es zeigt, wie verschiedene Schalter für verschiedene Spalten verwendet werden – xaxa

Verwandte Themen