Wie sortiere ich eine Liste von Zahlen und Nullwerten in aufsteigender Reihenfolge mit Nullwerten am Ende?

469
Ishan Madhusanka

Ich habe eine Liste mit Zahlen und Nullwerten. Wie kann ich sie so sortieren, dass die Nullwerte mit sort in GNU coreutils am Ende der Liste stehen ?

Beispieleingabe (input.data)

0.9000 23  1 2 5  -0.9000 -23  -1 -2 -5 

Wenn ich es mit versuchte, sort -g input.dataist die Ausgabe wie folgt.

<NULL> <NULL> <NULL> -23 -5 -2 -1 -0.9000 0.9000 1 2 5 23 

Hier werden Nullwerte an die Spitze gesetzt. Ist es möglich, die Nullwerte an das Ende der Liste zu bekommen?

0

2 Antworten auf die Frage

2
Socowi

Ich gehe davon aus, dass Ihre Nullwerte nur leere Zeilen sind.

Wenn Ihre einzige Anforderung ist, dass die leeren Zeilen am Ende sind, kehren Sie einfach die Reihenfolge um. Dies ändert natürlich auch die Reihenfolge der Zahlen. Hier sind einige Varianten nebeneinander:

$ sort -g file $ sort -gr file $ sort -r file 23 5 5 -5 2 23 -23 1 -23 -5 0.9000 2 -2 -0.9000 -2 -1 -1 1 -0.9000 -2 -1 0.9000 -5 0.9000 1 -23 -0.9000 2  5  23  

Wenn die Reihenfolge der Zahlen sein muss sort -gund nur die leeren Zeilen bis zum Ende verschoben werden sollen, können Sie einfach alle leeren Zeilen entfernen und am Ende einfügen.

grep . file | sort -g | cat - <(grep -v . file) 
1
Kamil Maciorowski

Erstellen Sie eine zusätzliche Spalte und sortieren Sie sie zuerst, und entfernen Sie sie am Ende:

<input.data sed 's/^/1 /; s/^1 $/2 /' | sort -k 1n -k 2g | sed 's/^. //' 

Der Vorteil ist, dass der Befehl seine Eingabe nur einmal liest, sodass Sie ihn in einer Pipe verwenden können.

Erläuterung:

  1. Der erste sedfügt 1 vor jeder Zeile ein (beachten Sie das nachgestellte Leerzeichen). Ist 1 jetzt die gesamte Zeile (dh die ursprüngliche Zeile war leer), wird diese durch ersetzt 2 . Dadurch wird eine zusätzliche Spalte erstellt, die angibt, ob die ursprüngliche Zeile leer war oder nicht.
  2. sort wird angewiesen, nach der ersten (extra) Spalte zu sortieren, erst dann nach der zweiten.
  3. Das Finale sedentfernt das, was zuerst hinzugefügt wurde.

Hinweis:

  • sortVerwendet in der Regel ein Gebietsschema ( Details ). Ich habe absichtlich Ziffern 1und 2numerische Sortierungen gewählt, damit der ganze Trick in einem (?) Vernünftigen westlichen Gebietsschema funktioniert.