join:「ファイル2がソートされていない」


13

_jeter3.txtと_jeter1.txtの2つのファイルがあります

私はそれらが両方とも20列でソートされていることを確認しました sort -c

sort -t '     ' -c -k20,20 _jeter3.txt
sort -t '     ' -c -k20,20 _jeter1.txt
#no errors

しかし、私がjoin両方のファイルにしたいときにエラーがあります、それは2番目のファイルがソートされていないと言います:

join -t '   ' -1 20 -2 20 _jeter1.txt _jeter3.txt > /dev/null
join: File 2 is not in sorted order

理由がわかりません。

cat /etc/*-release #FYI
openSUSE 11.0 (i586)
VERSION = 11.0

更新: ' sort -f'およびjoin -i(大文字と小文字を区別しない)を使用すると、問題が修正されます。しかし、それは私の最初の問題を説明していません。

更新:並べ替えと結合のバージョン:

> 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.
(...)

完全を期すために、「join --version」および「sort --version」の出力を教えてください。どのような状況でも、このエラーメッセージを表示するためにgnu joinの古いバージョンを入手することはできません。
ブルースエディガー

3
問題を示すサンプルデータとの出力を投稿してくださいlocale
ジル 'SO-悪であるのをやめる'

回答:


25

私は、Ubuntuの11.04で同じエラーを得たsortjoinの両方のバージョン(GNUのcoreutilsの)8.5インチ

それらは明らかに互換性がありません。実際、sortコマンドにはバグがあるようです。-f--ignore-case)オプションの有無にかかわらず違いはありません。ソートするときaaBは、常にの前になりaBaます。非英数字も常に無視されるようです(abc前にありますab-x

参加は反対を期待するようです...しかし、私は解決策を持っています

実際、これは照合シーケンスにリンクされています:LANG=en_EN sort -k 1,1 <myfile> ...then を使用LANG=en_EN join ...すると、メッセージが削除されます。

国際化は悪の根源です...(誰もそれを明確に文書化していない)。


だから、両方を使用するLANG=en_EN場合、それは間違いなく動作しますか?両方が同じロケールを使用している限り、どのロケールでも機能しますか?との違いはsortjoinデフォルトで異なるロケールを使用するということですか?
アーロンマクデイド14

ある-kオプションは、ここで答え、またはそれがありますかLANG=en_EN?ここで正確な解決策が何であるかは不明です。
ユーザー

5

数字でソートしましたか?私が参加していたコラムをゼロパディングすると、この問題が解決したことがわかりました。

cat file.txt \
     | awk -F"   " '{ $20=sprintf("%06s", $20); print $0}' \
     | sort > readytojoin.txt

5

入力ファイルを適切にソートし、それらの行をペアにすることができると確信している場合、上記のエラーを回避するには次を実行します。 join --nocheck-order file1.txt file2.txt


4

sort デフォルトでは、行全体をキーとして使用します

join 指定されたフィールドのみをキーとして使用します。

ソートを制限して、結合するキーのみを使用することにより、この非互換性を修正する必要があります。

Joinのマニュアルページには次のように記載されています。

重要:FILE1およびFILE2は、結合フィールドでソートする必要があります。たとえば、> 'join'にオプションがない場合は、 'sort -k 1b、1'を使用します。比較では、「LC_COLLATE」で指定されたルールが尊重されます。入力がソートされず、一部の行を結合できない場合、警告メッセージが表示されます。


2
LOCALE=C sort ...
LOCALE=C join ...

これで問題が解決します。@Michaelが指摘したように、問題は照合順序であり、LOCALE設定に依存します。


2

このエラーが表示され、特定の列で既にソートされており、壁に対して頭を叩いている場合(sort -k4,4など)、sortコマンドのセパレーターも設定する必要がある場合があります。

どうやらOPは既に-t ''でこれを行っているようですが、通常のタブ区切りのテキストにはお勧めします

sort -t $'\t' ...

sortコマンドは、タブ区切りファイルのように見えるものでも、デフォルトでスペースをセパレーターとして組み込むことができます(特に、ソートする列内にスペースがある場合)。

次に、そのソートされたデータを結合に渡した場合、

join -t $'\t' ...

次に、これにより、ソートされていないというエラーメッセージが表示されます。上記のように、joinは-t ''を受け入れない場合があります。


1

joinの場合、-tの後の引数は文字です。並べ替えには、より長い並べ替え区切り文字を指定できます。あなたがしたい別のフィールドのファイルに参加している可能性があり、ケースを無視すると偶然問題が解決すると思います。

また、サンプルデータが役立つとジルに同意します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.