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 myFile
Even
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 myFile
Even
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 -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
$ 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 -u
behält daher beide bei. ␠ca␠d
Vorher sortieren, ␠c␠c
da Leerzeichen im ersten Durchgang in meinem Gebietsschema ignoriert werden . cad
Vorher 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 d
und a 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 Puts a b c d
vorher 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 ␠␠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 haben c
).
blank
getrennt und können je nach Gebietsschema neben Leerzeichen und Tabulatoren auch andere Zeichen enthalten.
3,3
macht? 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 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
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,5n
nach Größe sortieren.
awk
Lö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
.