it-swarm.com.de

Sortieren Sie die Daten in absteigender Reihenfolge der ersten Spalte. Verwenden Sie für gleiche Werte die zweite Spalte in aufsteigender Reihenfolge

Lassen Sie mich klarstellen:

Angenommen, ich habe einige Schlüsselwörter mit der Häufigkeit ihrer Verwendung:

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

Was ich möchte, ist, diese Daten nach Häufigkeit in absteigender Reihenfolge zu sortieren. Wenn es einige gleiche Werte gibt, sollte die zweite Spalte in aufsteigender Reihenfolge verwendet werden.

sort -n -r foo.txt

Ist der erste Teil, aber dann die 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 das Argument -k Verwenden, aber ich kann nicht herausfinden, wie!

Ich möchte wissen, wie dies nur mit dem Befehl sort von bash geschehen kann. Wenn dies jedoch nicht nur mit sort erreicht werden kann, sollten andere Befehle Bourne Shell-kompatibel sein.

22
Pouya

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 ist, während der zweite gemäß der Sortierreihenfolge Standard Sortiert ist.

Zitiert aus POSIX-Sortierung :

- k keydef

Das Argument keydef Ist eine eingeschränkte Sortierschlüsselfelddefinition. Das Format dieser Definition lautet:

field_start [ type] [ , field_end [ type]]

dabei wird field_start und field_end ein Schlüsselfeld definiert, das auf einen Teil der Zeile beschränkt ist (siehe Abschnitt ERWEITERTE BESCHREIBUNG), und type ist ein Modifikator aus der Liste von Zeichen 'b', 'd', 'f', 'i', 'n', 'r'. Der Modifikator 'b' verhält sich wie die Option -b, Gilt jedoch nur für den field_start oder field_end, an den er angehängt ist. Die anderen Modifikatoren verhalten sich wie die entsprechenden Optionen, gelten jedoch nur für das Schlüsselfeld, an das sie angehängt sind. Sie sollen diesen Effekt haben, wenn sie mit field_start, field_end oder beiden angegeben werden. Wenn ein Modifikator an einen field_start oder an einen field_end angehängt ist, gilt für beide keine Option. Implementierungen müssen mindestens neun Vorkommen der Option -k Unterstützen, die in der Befehlszeilenreihenfolge von Bedeutung sein müssen. Wenn keine Option -k Angegeben ist, wird ein Standard-Sortierschlü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 Option -u Angegeben ist, werden Zeilen, die ansonsten gleich sind, so angeordnet, als ob keine der Optionen -d, -f, -i, -n Oder -k Waren vorhanden (aber mit -r Noch gültig, falls angegeben) und mit allen Bytes in den für den Vergleich signifikanten Zeilen. Die Reihenfolge, in der noch vergleichbare Zeilen geschrieben werden, ist nicht angegeben.

Dies würde produzieren:

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