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).
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
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
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.
[...] -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.
sort -u -k3 < myFile
.sort -u -k3 myFile
EvenAntworten:
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
-b
Mö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
sort
Befehl im Allgemeinen nicht integriert).-k 3
ist 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).-u
besteht 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 )).cat
ist der Befehl zu con Katze enate. Du brauchst es hier nicht.Wenn die Spalten durch etwas anderes getrennt sind, müssen Sie
-t
das Trennzeichen angeben.Beispieldatei angegeben
a
Mit
-u -k 3
:Zeile 2 und 3 haben dieselbe dritte Spalte, aber hier ist der Sortierschlüssel von der dritten Spalte bis zum Ende der Zeile und
-u
behält daher beide bei.␠ca␠d
Vorher sortieren,␠c␠c
da Leerzeichen im ersten Durchgang in meinem Gebietsschema ignoriert werden .cad
Vorher sortierencc
.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.Sehen Sie, wie die Reihenfolge von
a b c d
unda c c c
umgekehrt wird. Im ersten Fall, weil␠c␠c
vorher 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 Putsa b c d
vorher vergleichta c c c
.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.Sortieren Sie im Gebietsschema C
␠␠c
vor,␠c
da es dort nur einen Durchgang gibt, in dem Zeichen (dann einzelne Bytes) basierend auf ihrem Codepunktwert sortiert werden (wobei Leerzeichen einen niedrigeren Codepunkt als habenc
).quelle
blank
getrennt und können je nach Gebietsschema neben Leerzeichen und Tabulatoren auch andere Zeichen enthalten.3,3
macht? Warum nicht einfach3
?Wenn Sie „Spalte“ , wie er in Textdatei (4. Zeichen) verstehen dann ja, sollten Sie Ihre Lösung arbeiten (oder sogar
sort -u -k3 myFile
zu erlauben ,sort
einige 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(Das ist gleichbedeutend mit Trivialität
ls -lS
, dient aber dem Beispiel.)quelle
sort -k 1.3,1.3
.ls -l | sort -k5,5n
nach Größe sortieren.awk
Lösung ist genau das, was ich brauchte - einfach an komplexe Sortieranforderungen anzupassenist der richtige Befehl, um eine Liste mit numerischen Zeichen nach einer bestimmten Spalte zu sortieren
quelle
Sie können die awk Velour-Bibliothek verwenden :
quelle
Sortiert Ihre myfile-Datei in der dritten Spalte, wenn Ihre Datei kein Trennzeichen hat.
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.
quelle