Ich habe zwei Dateien _jeter3.txt und _jeter1.txt
Ich habe überprüft, ob beide nach der 20. Spalte sortiert sind sort -c
sort -t ' ' -c -k20,20 _jeter3.txt
sort -t ' ' -c -k20,20 _jeter1.txt
#no errors
aber es gibt einen Fehler, wenn ich zu join
beiden Dateien möchte, heißt es, dass die zweite Datei nicht sortiert ist:
join -t ' ' -1 20 -2 20 _jeter1.txt _jeter3.txt > /dev/null
join: File 2 is not in sorted order
Ich verstehe nicht warum.
cat /etc/*-release #FYI
openSUSE 11.0 (i586)
VERSION = 11.0
UPDATE : Die Verwendung von ' sort -f
' und join -i
(beide ohne Berücksichtigung der Groß- und Kleinschreibung) behebt das Problem. Aber es erklärt nicht mein anfängliches Problem.
UPDATE : Versionen von sort & join:
> join --version
join (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)
> sort --version
sort (GNU coreutils) 6.11
Copyright (C) 2008 Free Software Foundation, Inc.
(...)
locale
.Antworten:
Ich habe den gleichen Fehler mit Ubuntu 11.04, mit
sort
undjoin
beiden in Version (GNU coreutils) 8.5.Sie sind eindeutig nicht kompatibel. Tatsächlich
sort
scheint der Befehl fehlerhaft zu sein: Es gibt keinen Unterschied mit oder ohne die Option-f
(--ignore-case
). Beim SortierenaaB
steht immer voraBa
. Nicht alphanumerische Zeichen scheinen auch immer ignoriert zu werden (abc
steht davorab-x
)Join scheint das Gegenteil zu erwarten ... Aber ich habe eine Lösung
Tatsächlich ist dies mit der Kollatierungssequenz verknüpft: Mit
LANG=en_EN sort -k 1,1 <myfile> ...
then wirdLANG=en_EN join ...
die Nachricht entfernt.Internationalisierung ist die Wurzel des Bösen ... (niemand dokumentiert dies eindeutig).
quelle
LANG=en_EN
, dann wird es auf jeden Fall funktionieren? Funktioniert es für jedes Gebietsschema, solange beide dasselbe Gebietsschema verwenden? Können wir sagen, dass der Unterschied zwischensort
und darinjoin
besteht, dass standardmäßig ein anderes Gebietsschema verwendet wird?-k
Option die Antwort hier oder ist es dieLANG=en_EN
? Es ist unklar, welche Lösung hier genau vorliegt.Sortierten Sie mit Zahlen? Ich fand, dass das Auffüllen der Spalte mit Nullen, an der ich teilnahm, dieses Problem für mich löste.
quelle
Wenn Sie sicher sind, dass Sie Ihre Eingabedateien richtig sortiert haben und ihre Zeilen gepaart werden können, können Sie den obigen Fehler vermeiden, indem Sie ausführen
join --nocheck-order file1.txt file2.txt
quelle
sort
Standardmäßig wird die gesamte Zeile als Schlüssel verwendetjoin
Verwendet nur das angegebene Feld als Schlüssel.Sie müssen diese Inkompatibilität korrigieren, indem Sie die Sortierung so einschränken, dass nur der Schlüssel verwendet wird, an dem Sie teilnehmen möchten.
In der Manpage Join heißt es:
quelle
Dies wird Ihr Problem lösen. Das Problem ist, wie von @Michael hervorgehoben, die Kollatierungssequenz, die von Ihrer LOCALE-Einstellung abhängt.
quelle
Beachten Sie, dass Sie möglicherweise auch das Trennzeichen für den Sortierbefehl festlegen müssen, wenn dieser Fehler auftritt und Sie bereits nach einer bestimmten Spalte sortiert haben und Ihren Kopf gegen die Wand schlagen, z. B. -k4,4 sortieren
Anscheinend hat OP dies bereits mit -t '' getan, aber für einen normalen tabulatorgetrennten Text würde ich empfehlen
Der Sortierbefehl kann standardmäßig Leerzeichen als Trennzeichen enthalten, selbst wenn es sich um eine durch Tabulatoren getrennte Datei handelt (insbesondere, wenn die Spalte, nach der Sie sortieren, Leerzeichen enthält).
Dann, wenn Sie die sortierten Daten übergeben, um beizutreten, und Sie haben
Dies führt dann dazu, dass die Fehlermeldung darüber nicht sortiert wird. Wie oben erwähnt, akzeptiert der Join möglicherweise -t '' nicht.
quelle
Beim Join ist das Argument nach -t ein Zeichen. Für sort können Sie ein längeres Sortiertrennzeichen angeben. Ich denke, dass Sie möglicherweise die Dateien auf einem anderen Feld zusammenfügen, das Sie möchten, und den Fall zu ignorieren, löst das Problem durch Zufall.
Und ich stimme Gilles zu, dass Beispieldaten hilfreich wären.
quelle