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?
sort -u -k3 myFileEven
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?
sort -u -k3 myFileEven
Antworten:
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).
blankgetrennt und können je nach Gebietsschema neben Leerzeichen und Tabulatoren auch andere Zeichen enthalten.
3,3macht? Warum nicht einfach 3?
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.)
sort -k 1.3,1.3. ls -l | sort -k5,5nnach Größe sortieren.
awkLösung ist genau das, was ich brauchte - einfach an komplexe Sortieranforderungen anzupassen
sort -g -k column_number
ist der richtige Befehl, um eine Liste mit numerischen Zeichen nach einer bestimmten Spalte zu sortieren
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)
}
$ 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.
sort -u -k3 < myFile.