comm: Datei ist nicht in sortierter Reihenfolge

9

Ich habe commzwei sortierte Dateien verglichen. Jede Zeile in diesen Dateien ist eine positive Ganzzahl. Aber die Ergebnisse zeigen

comm: file 1 is not in sorted order
comm: file 2 is not in sorted order

Wie kommt es, dass der Fehler auch dann auftritt, wenn diese beiden Dateien sortiert sind?

wenzi
quelle
In meinem Fall hatte ich die Dateien mit Notepad ++ sortiert (lexikografisch aufsteigend), wobei Kleinbuchstaben und Großbuchstaben getrennt betrachtet wurden, z. a erscheint nach 'Z' in aufsteigender Reihenfolge. Dies unterscheidet sich von der Sortierung des Sortierdienstprogramms (Bash). Um dies zu überprüfen, habe ich alle Zeilen in Großbuchstaben konvertiert und dann in np ++ sortiert. Comm hat sich nicht mehr beschwert.
Sahil Singh

Antworten:

10

commerfordert eine lexikografische Sortierung (einfach sort), keine numerische Sortierung ( sort -n). Zum Beispiel möchte es die folgende Reihenfolge:

1
2000
300

Nicht die folgende Reihenfolge:

1
300
2000

Korrigieren Sie dies und das Problem sollte verschwinden. Weitere esoterischen Fällen , in denen comm‚s locale anders sein kann als die sortlocale, können Sie laufen sortund commmit LC_COLLATE=Cin ihrer Umgebung nativen Byteanordnung zu verwenden.

Chris Down
quelle
Wie kann man es numerisch sortieren lassen?
Wenzi
4
@wenzisort -n
Gilles 'SO- hör auf böse zu sein'
Lexographic Bestellung “ ist , wo eine Reihe von Zahlen ERHÖHEN in eine geordnete seeries- Sie es nach hinten in Ihrer Antwort haben: mathworld.wolfram.com/LexicographicOrder.html . Bitte beachten Sie meine unten Testergebnisse der Antwort , die Verwendung von Vergleich sort mit und ohne den -nSchalter und zeigt nur mit dem -nSchalter können Sie die korrekten erreichen zu erhöhen , um Sie in Ihrer eigenen Antwort erforderlich ist , bestätigen.
F1Linux
@ F1Linux Was? commerfordert buchstäblich LC_COLLATEd Bestellung. Es genügt zu sagen, dass die Fehler in Ihrer Antwort für Beispiele außerhalb Ihres Testsatzes nicht rein kosmetischer Natur sind ... niemand hat nach einer positiven numerischen Sortierung gefragt.
Chris Down
@ChrisDown Ihre Antwort, auf die ich geantwortet habe - nicht die, die Sie gerade bearbeitet haben, und nur JETZT erwähnt " LC_COLLATE " war: " comm möchte eine literallexikografische Sortierung, keine numerische Sortierung. Korrigieren Sie dies und das Problem sollte verschwinden . " In "LC_COLLATE" war etwas ganz anderes als "_Lexographic". In der Tat war Ihre anfängliche Antwort in nur einer Zeile ohne BEISPIELE so spärlich, dass ich die Frage mit meiner eigenen Antwort erneut betrachtete. Ich stimme Ihrer aktualisierten Antwort zu, da "LC_COLLATE" hier definitiv wirksam ist, wie Sie bemerkt haben.
F1Linux
0

AKTUALISIERTE ANTWORT:

PROBLEM:

Das OP erhält eine Fehlermeldung bezüglich " Datei ist nicht in sortierter Reihenfolge ", wenn positive Ganzzahlen in den Dateien commverglichen werden, nicht Text. Wir haben es also mit Nicht-Dezimalzahlen zu tun.

Kurze Antwort:

Abhängig von der Verwendung des -nSchalters mit dem sortBefehl zum Sortieren der gelieferten Ergebnisse commkann die Reihenfolge der zurückgegebenen Ergebnisse commsehr unterschiedlich sein:

Lexografisch : Die Verwendung des -nSchalters mit Sortierung führt dazu, dass die "positiven Ganzzahlen" in einer Reihe von zunehmenden Zahlen geordnet werden. Der " Fehler " kann mit dem commSchalter von ` unterdrückt werden--nocheck-order

Bytereihenfolge : Es gibt KEINE Verwendung des -n switchwith sort. LC_COLLATEbestimmt die Reihenfolge, die sogar davon abhängen kann, wie die localeauf dem Host eingestellt ist, auf dem der Befehl ausgeführt wird. Dies ist die Eingabe, die commstandardmäßig erwartet wird. Ein bisschen mehr darüber LC_COLLATEfinden Sie hier: Referenz1 und Referenz2

Ist der Fehler ein Problem? Das hängt davon ab, was Sie erreichen wollen. Wie Sie unten Beispiele in denen sehen werden,commgibt die gleichen Ergebnissenachdemdie Dateienvergleichen mit oder ohne sort `s-nSchalter, wenn auch ihre Reihenfolge in der obigen Art und Weise variiert je nachdemob die-n switchmit dem verwendet wirdsortBefehl. Ich selbst bevorzuge "lexografisch" geordnete Ergebniszahlen, die in einer Reihe zunehmen.

Wenn Sie die Ergebnisse jedoch nicht in " lexografischer " Reihenfolge anzeigen möchten , verwenden Sie den Schalter NICHT-n , wenn Sie die zum commVergleich gelieferten Daten sortieren .

TESTEN:

Wir werden die Ergebnisse des commBefehls mit und ohne -nSchalter vergleichen. Ich habe die Komplexität meines Probentestdatensatzes gemäß Kusalanandas Anfrage erhöht:

Testdaten :

file1.txt :

40
110000
2200
6
33000

file2.txt :

2200
40
33000
6
440000

Schnittpunkt :

Listen Sie nur Nummern auf, die BEIDEN Dateien gemeinsam sind

Ohne -nSchalter:

comm -12 <(sort file1.txt) <(sort file2.txt)

2200
33000
40
6

Ergebnisse : Richtig, aber in einer nicht sortierten Reihenfolge zurückgegeben

MIT -n Schalter:

comm -12 <(sort -n file1.txt) <(sort -n file2.txt)

6
40
2200
33000
comm: file 1 is not in sorted order

Ergebnisse : Richtig, aber in einer LEXOGRAPHISCH sortierten Reihenfolge zurückgegeben. Der Vorgang wurde erfolgreich abgeschlossen und lieferte die gleichen Ergebnisse wie commohne -nSchalter, jedoch in einer sortierten Liste.

Unterschied :

Listen Sie nur Zahlen auf, die für jede Datei eindeutig sind:

Ohne -nSchalter:

comm -3 <(sort file1.txt) <(sort file2.txt)

110000
         440000

Ergebnisse : Richtig - diese Nummern sind in der Tat exklusiv für die jeweilige Datei.

MIT -n Schalter:

comm -3 <(sort -n file1.txt) <(sort -n file2.txt)

110000
comm: file 1 is not in sorted order
         440000

Ergebnisse : Korrigieren Sie dieselben Ergebnisse wie commohne den -nSchalter, geben Sie jedoch den Fehler bezüglich der Reihenfolge der positiven Ganzzahlen zurück, die nicht in den Dateien selbst sortiert sind.

LÖSUNG für LEXOGRAFISCHE ERGEBNISSE:

Verwenden comm`s --nocheck-orderSchalter , um die Fehlermeldung zu unterdrücken. Da wir wissen, dass die Zahlen nicht in jeder Datei sortiert sind, aber die von zurückgegebenen Ergebnisse comm -nkorrekt sind, kann der Fehler sicher ignoriert werden, indem er unterdrückt wird:

Schnittpunkt :

comm -12 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)

6
40
2200
33000

Unterschied :

comm -3 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)

110000
         440000

FAZIT:

Der Fehler " Datei ist nicht in sortierter Reihenfolge " bei der Rückgabe Sortieren positiver Ganzzahlen commbedeutet nicht, dass die mit dem -nSchalter mit zurückgegebenen Ergebnisse commfalsch sind. In der Tat gibt die Verwendung comm -neine ordentliche Korrektur in einer sortierten Reihenfolge!

Vielen Dank an @dhag, @kusalananda @ChrisDown, für die Probleme, die weiter ausgebaut werden mussten. Ich freue mich immer über die Überprüfung meiner Arbeit: Der einzige Weg, wie wir besser werden können, besteht darin, dass wir ständig von unseren Kollegen gedrängt und herausgefordert werden.

F1Linux
quelle
In der Antwort mit der höchsten Abstimmung wird erwähnt, dass "comm lexikografische Sortierung wünscht", Sie jedoch anscheinend numerisch sortieren. Das sieht so aus, als würde es in einigen Fällen fallen.
Dhag
Testen Sie erneut mit Zahlen, die numerisch und lexikografisch unterschiedlich sortiert sind, z. B. 1000, 200, 30, 4.
Kusalananda
@Kusalananda Habe gerade dein sehr freundliches und nützliches Feedback in meine aktualisierte Antwort aufgenommen. Am dankbarsten für Ihr Feedback!
F1Linux
@dhag hat gerade meine Antwort aktualisiert, um Ihr & Kusalanadas Feedback zu berücksichtigen. Am meisten verpflichtet für Sie Leute, die sich die Zeit und Mühe nehmen, meine Antwort zu überprüfen
F1Linux
1
@ JeffSchaller In der Antwort, auf die ich ursprünglich geantwortet habe, wurde die Sortierung "Lexographic" erwähnt, nicht "LC_COLLATE" wie in Chris 'neu geänderter Antwort. Ich antwortete Chris, der korrekt ist, und stimmte seiner aktualisierten Antwort zu. "Lexographic" & "LC_COLLATE" sind verschiedene Bestien. Danke Jeff-
F1Linux