2017-08-17 4 views
1

Ich habe zwei Dateien mit der gleichen Zeichenfolge in der Spalte, aber in anderer Reihenfolge.Sortierbefehl gibt unerwartete Ausgabe

Datei test1:

testbench.clk1 667 
testbench.clk1_temp_net 667 
testbench.clk 2000 

und Datei test2:

testbench.clk1 533 
testbench.clk 1611  
testbench.clk1_temp_net 538 

ich irgendwie auf 1 Spalte Befehl ausführen, wie auf beiden Dateien folgt und es unterschiedlichen Ausgang geben:

sort -t " " -k1 test1 

testbench.clk1 667 
testbench.clk1_temp_net 667 
testbench.clk 2000 

sort -t " " -k1 test2 

testbench.clk1 533 
testbench.clk 1611 
testbench.clk1_temp_net 538 

Können Sie mir erklären, warum ich diese Ausgabe bekomme und welche Lösung dafür ist?

Antwort

4

Von info sort:

Viele Optionen beeinflussen, wie ‚Art‘ vergleicht Linien; Wenn die Ergebnisse unerwartet sind, versuchen Sie die '--debug' Option, um zu sehen, was passiert ist.

Lasst uns das tun (auf meinem de_DE.utf8 System)

sort --debug -k1 file1 
sort: es werden die Sortierregeln für »de_DE.utf8“ verwendet 
sort: führende Leerzeichen sind signifikant in Schlüssel 1: Sie sollten daher wahrscheinlich auch „b“ angeben 

es macht keinen Sinn, leider den Befehl auf Englisch zu zeigen, zu laufen, was passiert. Übersetzen es:

sort: sorting rules for »de_DE.utf8“ in use 
sort: preceding whitspace is significant in key 1: You might want to use „b“ 

Wenn ich den Befehl ausführen mit:

LANG=C sort -k1b file1 

die

nur sein kann
LANG=C sort -b file1 

der Auftrag ok aussieht. Ich schätze, es ist ein lokales Problem für dich auch.


Btw, wenn Sie eine hierarchische Art field1 möchten, verwenden Sie field2 dann:

LANG=C sort -k1,1b -k2,2n file 

Die Frage wurde markiert, aber es stellte sich heraus, dass die OP csh verwendet. In diesem Fall müssen Sie $LANG wie dies passieren:

env LANG=C sort ... 
+0

oh sorry ich habe alle Optionen ausprobiert und -k1 oder -k1,1. so versehentlich in Beschreibung. Bereits die Beschreibung aktualisiert. Vielen Dank –

+0

Sie hatten auch -n in einem Ihrer Befehle. Bist du sicher, dass es jetzt dieses Ergebnis geben wird? –

+0

@MarekVitek Ich habe es nach dem Entfernen von Option -n (numerische Sortierung) überprüft. Und es gibt falsche Ausgabe –

0

sortieren richtig müssen Sie Schlüssel angeben, mit denen Sie Ihre Daten durch die erste und dann durch die zweite Spalte in der Liste sortieren wird.

sort -k1,1 -k2,2 test1 

testbench.clk 2000 
testbench.clk1 667 
testbench.clk1_temp_net 667 

und für Datei2

sort -k1,1 -k2,2 test2 

testbench.clk 1611 
testbench.clk1 533 
testbench.clk1_temp_net 538 

Wenn Sie nur -k1 verwenden, wie Sie es erste Schlüssel nehmen tat, dann bis zum Ende der Zeile nach oben -, die als Standard-Sortier gleich ist. Das Problem besteht darin, dass sort scheinbar Leerzeichen zwischen Zahlen als Tausendertrennzeichen behandelt, wie es in manchen Sprachen der Fall ist.Das macht testbench.clk 1611 in testbench.clk1611 und testbench.clk1 533 in testbench.clk1533, auch wenn numerische Sortierung nicht verwendet wird.

Es ist nicht notwendig, mit LANG- oder LC_COLLATE-Variablen zu verfahren. Dies könnte dazu führen, dass Ihre Sortierung für bestimmte Sprachen falsche Ergebnisse liefert. Z.B. Zeichen č in der tschechischen Sprache verwendet und viele andere werden dann falsch sortiert.

+0

Warum '-V' (* Version sort *)? – hek2mgl

+0

@ hek2mgl Ich bin mir nicht wirklich sicher. Ich würde dieses Verhalten ohne jede Option erwarten. Ich weiß nicht, warum es version-sort heißt, aber die man-Seite sagt 'natürliche Art von (Versions-) Zahlen innerhalb von Text ', was auch immer die Version bedeutet. Probieren Sie dieses "printf" aa bb \ naab b \ na abb \ na cbb "| Sortiere -V' versuche es dann ohne -V und vergleiche die Ergebnisse. –

+0

Richtig wäre es, '-b' zu verwenden - wie ich in meiner Antwort gezeigt habe;) – hek2mgl