Inkonsistentes Verhalten des Sortierbefehls

8

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) +++
Ashkan
quelle
Kann das nicht reproduzieren, welche Art von Sorte verwenden Sie?
123
@ User112638726, ich benutze Sortierung 8.22 auf Centos 7
Ashkan
Stellen Sie sicher, dass die Datei keine nicht druckbaren Zeichen enthält, z \0. Zum Beispiel mit recode us..dump file.
Jimmy
1
Sie möchten es wahrscheinlich 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.
Stéphane Chazelas
4
Ich kann mit der Sortierung in rpm.pbone.net/index.php3/stat/4/idpl/26640824/dir/centos_7/com/… reproduzieren , die in dieser Hinsicht völlig kaputt zu sein scheint, nicht mit der Basis 8.22 von gnu.org . Ich kann sehen, dass das CentOS einen großen Internationalisierungs-Patch hat, der wahrscheinlich der Schuldige ist. Möglicherweise möchten Sie es CentOS als Fehler melden, falls dies noch nicht bekannt ist.
Stéphane Chazelas

Antworten:

3

Wie Stéphane Chazelas in dem Kommentar sagte , handelt es sich um einen Fehler in der spezifischen Implementierung von coreutils(in coreutils-8.22-11.el7) durch CentOS / Red Hat, insbesondere in dem fehlerhaften Internationalisierungs-Patch ( coreutils-i18n.patch), den sie zusätzlich zu GNUs geschrieben und angewendet haben coreutils-8.22.

Ich habe es hier CentOS und hier Red Hat gemeldet . Es war bereits bekannt , bei Red Hat und dort fixiert in coreutils-8.22-13.el7.

Dieser ist derzeit noch nicht für CentOS verfügbar (20.08.2015).

Beachten Sie der Vollständigkeit halber, dass der Fehler auch (fälschlicherweise, da der Fehler nicht vorhanden war) in Upstreams (bei GNUs ) gemeldet wurde, in denen Sie weitere Informationen dazu finden.

Ashkan
quelle
1

Ihre Standardkollatierung (en_US.UTF-8) verursacht dies. Sie sollten den Wert LC_COLLATE festlegen , um den Text wie angegeben zu ordnen.

 LC_COLLATE='C' sort -k1 file1
efesaid
quelle
1
Meine Frage ist, warum meine Standardkollatierung so funktioniert. Eine davon kann wahr sein a is before Aoder a is after Anicht beide. Wie kann eine Kollatierung zu beidem führen?
Ashkan
Nicht sort -k1, sort -k1ist das gleiche wie sort. Es sortiert nach dem Abschnitt der Zeile, der beim ersten Feld beginnt, also im Grunde genommen nach der gesamten Zeile. sort -k1,1auf dem ersten Feld zu sortieren.
Stéphane Chazelas
@ Ashkan Ich denke, eine Zusammenstellung könnte das erklären Aund aist gleich. Der Sortierbefehl würde dann nach späteren Zeichen in der Zeile sortieren. Andernfalls würden sie in der Reihenfolge belassen, in der sie ursprünglich in der Datei angezeigt wurden. Zum Beispiel ac, aa, Absollte, wie sortiert werden aa, Ab, ac, nicht Ab, aa, acoder aa, ac, Ab.
rjmunro