web-dev-qa-db-ja.com

comm:ファイルが並べ替えられていません

commを使用して、2つのソートされたファイルを比較しました。これらのファイルの各行は正の整数です。しかし、結果は

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

これらの2つのファイルがソートされている場合でも、エラーが発生するのはなぜですか?

9
wenzi

commには、数値ソート(sort -n)ではなく、辞書式ソート(プレーンsort)が必要です。たとえば、次の順序が必要です。

1
2000
300

次の順序ではありません:

1
300
2000

これを修正すれば、問題はなくなるはずです。 commのロケールがsortロケールと異なる可能性のあるより難解なケースでは、sortおよびcommLC_COLLATE=Cで実行することができます。ネイティブバイトオーダーを使用するための環境。

10
Chris Down

更新された回答:

問題:

commは、テキストではなく、ファイル内の正の整数を比較します。したがって、10進数以外の数値を扱っています。

短い答え:

sortに提供される結果の並べ替えに使用されるcommコマンドでの-nスイッチの使用に応じて、commによって返される結果の順序は大きく異なる場合があります:

Lexographic:並べ替えで-nスイッチを使用すると、「正の整数」が一連の増加する数字の順に並べられます。 "error"は、comm`sスイッチ--nocheck-orderを使用して抑制できます

Byte Order:あり[〜#〜] no [〜#〜]sortでの-n switchの使用。 LC_COLLATEは、コマンドが実行されるホストでのlocaleの設定方法によって異なる順序を決定します。これは、commがデフォルトで期待する入力です。 LC_COLLATEの詳細については、こちらをご覧ください: Reference1 および Reference2

エラーは問題ですか?それは達成しようとしていることに依存します。以下の例でわかるように、commはファイルを比較した後も同じ結果を返しますwithまたはなしsort `s -nスイッチは、-n switchsortコマンドで使用されているかどうかによって、上記のように順序が異なります。私自身は、「辞書式」の順序付けされた結果(系列で増加する数値)を好みます。

ただし、しない結果が「lexographic "順序、次に[〜#〜]しない[〜#〜]指定されたデータをソートするときに-nスイッチを使用比較のためにcommに変更します。

テスト:

commコマンドの結果を-nスイッチの有無で比較します。 Kusalanandaの要求に従って、標本テストデータセットの複雑さを増やしました。

テストデータ

file1.txt

40
110000
2200
6
33000

file2.txt

2200
40
33000
6
440000

交差点

[〜#〜]両方[〜#〜]ファイルに共通の番号のみをリストします

-nスイッチなし:

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

2200
33000
40
6

結果:正解ですが、ソートされていない順序で返されます

[〜#〜] with [〜#〜]-nスイッチ:

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

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

結果:正しいが、[〜#〜] lexographic [〜#〜]ソートされた順序。操作は正常に完了し、-nスイッチなしでcommを使用した場合と同じ結果が返されましたが、並べ替えられたリストで返されました。

各ファイルに固有の番号のみをリストします。

-nスイッチなし:

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

110000
         440000

結果:正解-これらの数値は、実際に各ファイルに排他的です。

[〜#〜] with [〜#〜]-nスイッチ:

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

110000
comm: file 1 is not in sorted order
         440000

Results:正しい、commと同じ結果で、-nスイッチを使用しないが、正の順序に関するエラーを返す整数がファイル自体でソートされていません。

LEXOGRAPHIC結果のソリューション:

comm`s --nocheck-orderスイッチを使用して、エラーメッセージを抑制します。番号が各ファイルでソートされていないことはわかっていますが、comm -nによって返される結果は正しいので、エラーを抑制して無視しても安全です。

交差点

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

6
40
2200
33000

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

110000
         440000

結論:

commは、comm-nスイッチを使用して返された結果が間違っていることを意味するものではありません。実際、comm -nを使用すると、整理された順序で整然とした正解が返されます。

さらに拡張が必要な​​問題を提起してくれた@ dhag、@ kusalananda @ChrisDownに感謝します。私の仕事をレビューしてもらえるといつも幸せです。私たちが良くなるための唯一の方法は、私たちが仲間から常に押し付けられ、挑戦されている場合です。

0
F1Linux