Daten in absteigender Reihenfolge der ersten Spalte sortieren. Für gleiche Werte die zweite Spalte in aufsteigender Reihenfolge verwenden

22

Lassen Sie mich erklären:

Angenommen, ich habe einige Keywords mit der Häufigkeit ihrer Verwendung:

12 Hi
7  Hash
7  C++  
9  Superuser
17 Stackoverflow
9  LaTeX  
42 Life
9  Ubuntu

Ich möchte, dass diese Daten nach Häufigkeit in absteigender Reihenfolge sortiert werden. Wenn es gleiche Werte gibt, sollte die zweite Spalte in aufsteigender Reihenfolge verwendet werden.

sort -n -r foo.txt

Ist der erste Teil dann aber zweite Spalte auch reversed:

42 Life
17 Stackoverflow
12 Hi
9  Ubuntu
9  Superuser
9  LaTeX  
7  Hash
7  C++

Wie kann ich die folgenden Ergebnisse erzielen?

42 Life
17 Stackoverflow
12 Hi
9  LaTeX  
9  Superuser
9  Ubuntu
7  C++ 
7  Hash

Ich denke, ich muss -kargumentieren, aber ich kann nicht herausfinden, wie!

Ich möchte wissen, wie dies mit alleinigen sortBefehlen von getan werden kann bash. Wenn dies jedoch nicht nur mit möglich ist sort, sollten andere Befehle mit der Bourne-Shell kompatibel sein.

Pouya
quelle
[Etwas OT]: Obwohl für diese bestimmten Daten äquivalent, ist die Verwendung der GNU-Sortieroption -g(allgemein numerisch) anstelle von -nnumerischen Vergleichen sicherer: Sie funktioniert sowohl für Gleitkommazahlen als auch für ganze Zahlen korrekt.
Arielf

Antworten:

32

Geben Sie die Sortierschlüssel separat mit den Kriterien an:

sort -k1,1nr -k2,2 inputfile

Dies gibt an, dass der erste Schlüssel numerisch in umgekehrter Reihenfolge sortiert wird, während der zweite Schlüssel gemäß der Standardsortierreihenfolge sortiert wird.

Aus POSIX sortieren :

-k keydef

Das keydef- Argument ist eine eingeschränkte Sortierschlüsselfelddefinition. Das Format dieser Definition ist:

field_start [ Typ ] [ , field_end [ Typ ]]

wo field_start und field_end ein Schlüsselfeld auf einen Teil der Linie (siehe die ausgefahrene BESCHREIBUNG Abschnitt) beschränkt definieren, und der Typ ist ein Modifikator aus der Liste von Zeichen ‚b‘, ‚d‘, ‚f‘, ‚i‘, ' n ',' r '. Der Modifikator 'b' soll sich wie die -bOption verhalten , gilt jedoch nur für das Feld_Start oder Feld_Ende, an das er angehängt ist. Die anderen Modifikatoren verhalten sich wie die entsprechenden Optionen, gelten jedoch nur für das Schlüsselfeld, dem sie zugeordnet sind. Sie haben diesen Effekt, wenn sie mit field_start , field_end oder beiden angegeben werden.gilt auch für keine Option. Die Implementierungen müssen mindestens neun Vorkommen der -kOption unterstützen, die in der Befehlszeilenreihenfolge von Bedeutung sind. Wenn keine -kOption angegeben ist, wird ein Standardsortierschlüssel für die gesamte Zeile verwendet.

Wenn mehrere Schlüsselfelder vorhanden sind, werden spätere Schlüssel erst verglichen, nachdem alle früheren Schlüssel gleich verglichen wurden. Außer , wenn die -uOption angegeben ist, Linien , die ansonsten gleich vergleichen sind , als ob keine der Optionen bestellt werden -d, -f, -i, -n, oder -kwaren anwesend (aber mit -r in der Tat immer noch, wenn es angegeben wurde) und mit allen Bytes in den Leitungen signifikant die Vergleich. Die Reihenfolge, in der noch gleiche Zeilen geschrieben werden, ist nicht festgelegt.

Dies würde erzeugen:

42 Life
17 Stackoverflow
12 Hi
9  LaTeX
9  Superuser
9  Ubuntu
7  C++
7  Hash
devnull
quelle
Vielen Dank. Hat den Trick gemacht. Müssen 10 Minuten warten, um zu akzeptieren!
Pouya
@StephaneChazelas Danke für den Hinweis; hat die Referenz aktualisiert.
Devnull