comm
を使用して、2つのソートされたファイルを比較しました。これらのファイルの各行は正の整数です。しかし、結果は
comm: file 1 is not in sorted order
comm: file 2 is not in sorted order
これらの2つのファイルがソートされている場合でも、エラーが発生するのはなぜですか?
comm
には、数値ソート(sort -n
)ではなく、辞書式ソート(プレーンsort
)が必要です。たとえば、次の順序が必要です。
1
2000
300
次の順序ではありません:
1
300
2000
これを修正すれば、問題はなくなるはずです。 comm
のロケールがsort
ロケールと異なる可能性のあるより難解なケースでは、sort
およびcomm
をLC_COLLATE=C
で実行することができます。ネイティブバイトオーダーを使用するための環境。
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 switch
がsort
コマンドで使用されているかどうかによって、上記のように順序が異なります。私自身は、「辞書式」の順序付けされた結果(系列で増加する数値)を好みます。
ただし、しない結果が「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
結果:正解ですが、ソートされていない順序で返されます
-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
結果:正解-これらの数値は、実際に各ファイルに排他的です。
-n
スイッチ:comm -3 <(sort -n file1.txt) <(sort -n file2.txt)
110000
comm: file 1 is not in sorted order
440000
Results:正しい、comm
と同じ結果で、-n
スイッチを使用しないが、正の順序に関するエラーを返す整数がファイル自体でソートされていません。
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に感謝します。私の仕事をレビューしてもらえるといつも幸せです。私たちが良くなるための唯一の方法は、私たちが仲間から常に押し付けられ、挑戦されている場合です。