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 join
und es beschwert sich derzeit, dass die eine der Dateien nicht sortiert ist.
In meiner Umgebung LC_COLLATE
und LC_ALL
sind nicht eingestellt, LANG
ist eingestellt aufen_US.UTF-8
Mit LC_ALL=C sort -k1,1
der 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 join
funktioniert. Um sicher zu sein kann ich auch prepend join
mit LC_ALL=C
.
Meine Frage
Warum sorted1
a
ist in vorher A
und in sorted2
a
ist nachher A
? Was auch immer die Sortierung ist, es ist für beide sort
Befehle 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=C
trotzdem 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.