I'm mit einer riesigen 4-Spalten-Datei. I'd wie die sortierte Datei in stdout basierend auf seiner 3:
cat myFile | sort -u -k3
Reicht das aus, um den Trick auszuführen?
sort -k 3,3 myFile
würde die Datei nach der Spalte 3rd sortiert anzeigen, unter der Annahme, dass die Spalten durch Sequenzen von Leerzeichen (ASCII SPC- und TAB-Zeichen im POSIX/C-Locale) getrennt sind, entsprechend der vom aktuellen Locale definierten Sortierreihenfolge.
Beachten Sie, dass die führenden Leerzeichen in die Spalte miteinbezogen werden (das Standardtrennzeichen ist der Übergang von einem Nicht-Leerzeichen zu einem Leerzeichen), was in Gebietsschemata, in denen Leerzeichen zum Zweck des Vergleichs nicht ignoriert werden, einen Unterschied machen kann; verwenden Sie die Option -b
, um die führenden Leerzeichen zu ignorieren.
Beachten Sie, dass dies völlig unabhängig von der Shell ist (alle Shells würden diese Befehlszeile gleich auswerten, Shells haben im Allgemeinen den Befehl sort
nicht eingebaut).
Mit "k 3" wird nach dem Teil der Zeilen sortiert, der mit der Spalte "3" beginnt (einschließlich der führenden Leerzeichen). Da in der C-Sprache die Leer- und Tabulatorzeichen vor allen druckbaren Zeichen stehen, führt dies im Allgemeinen zum gleichen Ergebnis wie -k 3,3
(außer bei Zeilen, die ein identisches drittes Feld haben),
Mit "-u" wird nur eine der Zeilen beibehalten, wenn es mehrere gibt, die identisch sortiert sind (d.h. wenn der Sortierschlüssel gleich sortiert (das ist nicht unbedingt dasselbe wie gleich)).
cat
ist der Befehl zum concatenate. Sie brauchen ihn hier nicht.
Wenn die Spalten durch etwas anderes getrennt sind, brauchen Sie die Option -t
, um das Trennzeichen anzugeben.
Gegebene Beispieldatei a
$ cat a
a c c c
a b ca d
a b c e
a b c d
Mit -u -k 3
:
$ echo $LANG
en_GB.UTF-8
$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b c e
Zeile 2 und 3 haben die gleiche dritte Spalte, aber hier ist der Sortierschlüssel von der dritten Spalte bis zum Ende der Zeile, also behält -u
beide bei. ␠ca␠d
sortiert vor ␠c␠c
, weil Leerzeichen im ersten Durchgang in meinem Gebietsschema ignoriert werden, cad
sortiert vor cc
.
$ sort -u -k 3,3 a
a b c d
a b c e
a b ca d
Oben wird nur eine für diejenigen beibehalten, bei denen die dritte Spalte ␠c
ist. Beachten Sie, dass die mit ␠␠c
(2 führende Leerzeichen) beibehalten wird.
$ sort -k 3 a
a b ca d
a c c c
a b c d
a b c e
$ sort -k 3,3 a
a b c d
a c c c
a b c e
a b ca d
Beachten Sie, dass die Reihenfolge von a b c d
und a c c c
umgekehrt ist. Im ersten Fall, weil ␠c␠c
vor ␠c␠d
sortiert, im zweiten Fall, weil der Sortierschlüssel derselbe ist (␠c
), setzt der letzte Vergleich, der die Zeilen vollständig vergleicht, a b c d
vor a c c c
.
$ sort -b -k 3,3 a
a b c d
a b c e
a c c c
a b ca d
Sobald wir die Leerzeichen ignorieren, ist der Sortierschlüssel für die ersten 3 Zeilen derselbe (c
), so dass sie nach dem Vergleich der letzten Instanz sortiert werden.
$ LC_ALL=C sort -k 3 a
a b c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b c e
a b c d
a c c c
a b ca d
Im C-Locale wird ␠␠c
vor ␠c
sortiert, da es dort nur einen Durchlauf gibt, bei dem Zeichen (dann einzelne Bytes) nach ihrem Codepunktwert sortiert werden (wobei Leerzeichen einen niedrigeren Codepunkt als c
haben).
Wenn Sie unter "Spalte" eine Textdatei (4. Zeichen) verstehen, dann sollte Ihre Lösung funktionieren (oder sogar sort -u -k3 myFile
, damit sort
einige speicherschonende Zaubereien mit zufälligem Zugriff durchführen kann). Wenn Sie unter "Spalte" eine Datenbank verstehen - eine ganze Einheit von Daten, gefolgt von einem Trennzeichen und variabler Spaltenbreite, dann brauchen Sie etwas Ausgefalleneres, z.B. sortiert ls -l nach Größe
ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-
(was dem trivialen ls -lS
entspricht, aber dem Beispiel gut dient).
sort -g -k column_number
ist der richtige Befehl, um eine Liste mit numerischen Zeichen nach einer bestimmten Spalte zu sortieren