Sortieren Sie nach der dritten Spalte

131

Ich stelle eine sehr große Akte mit 4 Spalten gegenüber. Ich möchte die sortierte Datei in stdout basierend auf ihrer 3. Spalte anzeigen:

cat myFile | sort -u -k3

Ist das genug, um den Trick auszuführen?

user1058398
quelle
4
Beachten Sie, dass Sie dies als schreiben können sort -u -k3 < myFile.
Gerrit
6
As sort -u -k3 myFileEven
Sebastian Graf

Antworten:

166
sort -k 3,3 myFile

würde Anzeige durch die 3 sortierte die Datei RD Spalte unter der Annahme , die Spalten getrennt sind durch Sequenzen von Rohlingen (ASCII SPC und TAB - Zeichen in dem POSIX / C locale), entsprechend der Reihenfolge , um von der aktuellen locale definiert.

Beachten Sie, dass die führenden Rohlinge enthalten in der Spalte (die Standardtrenn ist der Übergang von einem nicht-Rohling zu einem Rohling), das einen Unterschied in Gegenden machen kann , wo Räume sind nicht für den Zweck des Vergleichs ignoriert wird , verwenden , um die -bMöglichkeit zu ignorieren , die führenden Leerzeichen.

Beachten Sie, dass es völlig unabhängig von der Shell ist (alle Shells würden diese Befehlszeile gleich analysieren, in Shells ist der sortBefehl im Allgemeinen nicht integriert).

-k 3ist auf dem Teil der Leitungen mit der ausgehend 3 zu sortieren rd Spalte (einschließlich der führenden Blanks). Da im Gebietsschema C das Leerzeichen und das Tabulatorzeichen vor allen druckbaren Zeichen stehen, erhalten Sie im Allgemeinen das gleiche Ergebnis wie -k 3,3(mit Ausnahme von Zeilen mit identischem dritten Feld).

-ubesteht darin, nur eine der Zeilen beizubehalten, wenn es mehrere gibt, die identisch sortiert sind (dh der Sortierschlüssel sortiert gleich (das muss nicht gleich sein )).

catist der Befehl zu con Katze enate. Du brauchst es hier nicht.

Wenn die Spalten durch etwas anderes getrennt sind, müssen Sie -tdas Trennzeichen angeben.

Beispieldatei angegeben 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 dieselbe dritte Spalte, aber hier ist der Sortierschlüssel von der dritten Spalte bis zum Ende der Zeile und -ubehält daher beide bei. ␠ca␠dVorher sortieren, ␠c␠cda Leerzeichen im ersten Durchgang in meinem Gebietsschema ignoriert werden . cadVorher sortieren 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 sich die 3. Spalte befindet ␠c. Beachten Sie, wie das 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

Sehen Sie, wie die Reihenfolge von a b c dund a c c cumgekehrt wird. Im ersten Fall, weil ␠c␠cvorher sortiert wurde ␠c␠d, im zweiten Fall, weil der Sortierschlüssel derselbe ist ( ␠c), wird der letzte Vergleich durchgeführt, der die Zeilen in vollständigen Puts a b c dvorher vergleicht 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 drei Zeilen derselbe ( c), sodass sie nach dem Vergleich der letzten Möglichkeit 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

Sortieren Sie im Gebietsschema C ␠␠cvor, ␠cda es dort nur einen Durchgang gibt, in dem Zeichen (dann einzelne Bytes) basierend auf ihrem Codepunktwert sortiert werden (wobei Leerzeichen einen niedrigeren Codepunkt als haben c).

Stéphane Chazelas
quelle
Die Spalten sind blankgetrennt und können je nach Gebietsschema neben Leerzeichen und Tabulatoren auch andere Zeichen enthalten.
jfs
1
Schön, +1. Könntest du erklären, was das 3,3macht? Warum nicht einfach 3?
terdon
@terdon, siehe erweiterte Beschreibung mit Beispielen.
Stéphane Chazelas
@ JFSebastian, du hast recht, Antwort aktualisiert.
Stéphane Chazelas
Ah, um es nur am 3. zu sortieren, nicht am Rest der Zeile, danke.
terdon
4

Wenn Sie „Spalte“ , wie er in Textdatei (4. Zeichen) verstehen dann ja, sollten Sie Ihre Lösung arbeiten (oder sogar sort -u -k3 myFilezu erlauben , sorteinige Speicherspar magics mit Direktzugriff durchführen). Wenn Sie "Spalte" wie in der Datenbank verstehen - eine ganze Entität von Daten, gefolgt von einem Trennzeichen und variabler Spaltenbreite, benötigen Sie etwas Feineres, z. B. das Sortieren von ls -l nach Größe

      ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-

(Das ist gleichbedeutend mit Trivialität ls -lS, dient aber dem Beispiel.)

SF.
quelle
5
Nein, durch Standardsortier Spalten Leerzeichen getrennt sind, sind sie nicht Zeichenspalten, in der 3. Zeichenspalte zu sortieren, würde die Syntax sein: sort -k 1.3,1.3. ls -l | sort -k5,5nnach Größe sortieren.
Stéphane Chazelas
Die awkLösung ist genau das, was ich brauchte - einfach an komplexe Sortieranforderungen anzupassen
und
2
sort -g -k column_number 

ist der richtige Befehl, um eine Liste mit numerischen Zeichen nach einer bestimmten Spalte zu sortieren

Jayant Kumar Jain
quelle
1
Die Verwendung von -k wurde bereits sehr gut behandelt, daher wäre es hilfreich, wenn Sie erklären würden, wie dieser Befehl anders oder besser ist. Möglicherweise können Sie auch tatsächliche Spaltennummern angeben, um die eigentliche Frage des OP zu beantworten.
Jeff Schaller
Dies brachte mich dazu, die Manpages zu benutzen: p "-g, --general-numeric-sort, compare to general numerical value", was ich in meinem Fall brauchte.
Joel
1

Sie können die awk Velour-Bibliothek verwenden :

#!/usr/local/bin/velour -f
{
  q[NR] = $3
  z[NR] = $0
}
END {
  a_sort_by(q, z)
  io_puts(q)
}
Steven Penny
quelle
0
$ sort -k 1.3,1.3 myfile

Sortiert Ihre myfile-Datei in der dritten Spalte, wenn Ihre Datei kein Trennzeichen hat.

$ cat myfile 
ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb

$ sort -k 1.3,1.3 myfile 
pp0dd 
aa1bb
aa3ya 
ax5aa 
fg7ds 

Manpage von Art:

[...] -k, --key = POS1 [, POS2] Startet einen Schlüssel an POS1 (Ursprung 1) und beendet ihn an POS2 (Standard-Zeilenende). [...] POS ist F [.C] [ OPTS], wobei F die Feldnummer und C die Zeichenposition im Feld ist; beide sind Ursprung 1. Wenn weder -t noch -b aktiv sind, werden die Zeichen in einem Feld vom Anfang des vorhergehenden Leerzeichens an gezählt. OPTS ist eine oder mehrere Einzelbuchstaben-Bestelloptionen, die die globalen Bestelloptionen für diesen Schlüssel überschreiben. Wenn kein Schlüssel angegeben ist, verwenden Sie die gesamte Zeile als Schlüssel.

Mit --key = 1.3,1.3 sagten Sie, dass es nur ein Feld (die gesamte Zeile) gibt und dass Sie die dritte Zeichenposition dieses Feldes vergleichen.

Franck
quelle