Ich möchte zwei Dateien sortieren, kann aber keine konsistenten Ergebnisse erzielen. Es scheint, dass es Probleme mit der Sortierung gibt, aber ich kann den Grund nicht verstehen. In Beispieldateien ist das Trennzeichen ein einzelnes Leerzeichen:
Datei1:
a
b
B
A
Datei2:
a 1
b 0
B 1
A 0
Ich benutze sort -k1,1, um diese Dateien zu sortieren und die Ausgabe ist:
sortiert1:
a
A
b
B
sortiert2:
A 0
a 1
b 0
B 1
Ich brauche diese sortierten Dateien in einem joinund es beschwert sich derzeit, dass die eine der Dateien nicht sortiert ist.
In meiner Umgebung LC_COLLATEund LC_ALLsind nicht eingestellt, LANGist eingestellt aufen_US.UTF-8
Mit LC_ALL=C sort -k1,1der Ausgabe ist:
sortiert11:
A
B
a
b
sortiert22:
A 0
B 1
a 1
b 0
Ich brauche keine bestimmte Bestellung, ich möchte nur, dass sie sich den Ergebnissen anschließen kann. Dieser Weg joinfunktioniert. Um sicher zu sein kann ich auch prepend joinmit LC_ALL=C.
Meine Frage
Warum sorted1 aist in vorher A und in sorted2 aist nachher A ? Was auch immer die Sortierung ist, es ist für beide sortBefehle und ich sortiere nach Spalte 1, die in beiden Eingabedateien identisch ist.
Ausgabe von hinzugefügt ltrace -e strcoll
Datei1
sort->strcoll("B","A") =1
sort->strcoll("a","b") =-1
sort->strcoll("a","A") =-7
a
sort->strcoll("b","A") =1
A
sort->strcoll("b","B") =-7
b
B
+++ exited (status 0) +++
file2
sort->strcoll("B 1","A 0") =1
sort->strcoll("a 1","b 0") =-1
sort->strcoll("a 1","A 0") =1
A 0
sort->strcoll("a 1","B 1) =-1
a 1
sort->strcoll("b 0","B 1") =-1
b 0
B 1
+++ exited (status 0) +++
\0. Zum Beispiel mit recode us..dump file.
LC_ALL=Ctrotzdem verwenden join, insbesondere wenn die Datei Nicht-ASCII-Zeichen enthält, da alle UTF-8-Glibc-Gebietsschemas fehlerhaft sind, da viele verschiedene Zeichen und Sortierelemente dort gleich sortiert sind.