Verwenden Sie die GNU-Sortierung, um nach einem einzelnen Schlüssel zu sortieren / um ein unerwünschtes Sortieren anderer Schlüssel zu verhindern

9

Ich habe eine Datei, die bereits bestellte Daten enthält, und ich möchte die Datei gemäß den Werten in einem Schlüssel neu anordnen, ohne die Reihenfolge der Daten in den anderen Schlüsseln zu zerstören.

Wie verhindere ich, dass die GNU-Sortierung eine Zeilensortierung basierend auf den Werten der Schlüssel durchführt, die ich nicht angegeben habe, oder wie spezifiziere ich die GNU-Sortierung, um einen Schlüsselbereich beim Sortieren zu ignorieren?

Datei data.txt:

1 Don't
2 C 
1 Sort
2 B
1 Me
2 A

Erwartete Ausgabe:

1 Don't
1 Sort
1 Me
2 C
2 B
2 A

Befehl:

sort -k 1,1 <data.txt

Ergebnis: unerwünschte Sortierung, nach der ich nicht gefragt habe:

1 Don't
1 Me
1 Sort
2 A
2 B
2 C
Wil
quelle

Antworten:

21

Sie brauchen eine stabile Sorte . Von man sort:

-s, --stable
       stabilize sort by disabling last-resort comparison

nämlich.:

$ sort -sk 1,1 <data.txt
1 Don't
1 Sort
1 Me
2 C 
2 B
2 A

Beachten Sie, dass Sie wahrscheinlich auch eine möchten -noder --numeric-sortwenn Ihr Schlüssel numerisch ist (z. B. können Sie unerwartete Ergebnisse erhalten, wenn Sie 10 mit 2 mit der standardmäßigen - lexikalischen - Sortierreihenfolge vergleichen). In diesem Fall geht es nur darum:

sort -sn <data.txt

Das erste Feld muss nicht extrahiert werden, da die numerische Interpretation der gesamten Zeile mit der des ersten Felds übereinstimmt.

Steeldriver
quelle
Ich habe die Dokumente gelesen, aber die richtige Definition von "stabil" hat meine Aufmerksamkeit umgangen. Vielen Dank für die schnelle, präzise und gut zitierte Antwort. Der erste Schlüssel der realen Daten ist eine lokalisierte Zeichenfolge, daher würde numerisch für mich nicht funktionieren.
Wil
4

Für (Nicht-GNU-) sortImplementierungen, denen eine -sOption fehlt , können Sie immer Folgendes tun:

<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-

Stellen Sie also die Zeilennummer voran, um sie zum zweiten Sortierschlüssel zu machen, und entfernen Sie sie anschließend.

Stéphane Chazelas
quelle