以前comm
は2つのソート済みファイルを比較していました。これらのファイルの各行は正の整数です。しかし、結果は
comm: file 1 is not in sorted order
comm: file 2 is not in sorted order
これらの2つのファイルがソートされている場合でも、エラーが発生するのはなぜですか?
以前comm
は2つのソート済みファイルを比較していました。これらのファイルの各行は正の整数です。しかし、結果は
comm: file 1 is not in sorted order
comm: file 2 is not in sorted order
これらの2つのファイルがソートされている場合でも、エラーが発生するのはなぜですか?
回答:
comm
sort
数値ソート(sort -n
)ではなく、辞書式ソート(プレーン)が必要です。たとえば、次の順序が必要です。
1
2000
300
次の順序ではありません:
1
300
2000
これを修正すれば、問題はなくなるはずです。難解な場合のためcomm
のロケールがとは異なる可能性がsort
ロケール、あなたが実行したいことsort
とcomm
しLC_COLLATE=C
、その環境でのネイティブのバイト順序を使用します。
sort -n
sort
として、なし-n
スイッチのみを示していて-n
、あなたが正しい達成することができますスイッチを増やすご了承順序は、あなた自身の答えで必要とされます。
comm
文字通りLC_COLLATE
d順序が必要です。答えのエラーは、テストセット以外の例では純粋に表面的なものではないというだけで十分です...正の数値によるソートは要求されませんでした。
を使用して、テキストではなくファイル内の正の整数を比較すると、OPは「ファイルがソートされていない」というエラーを受け取ります。したがって、10進数以外の数値を扱っています。comm
に提供される結果をソートするために使用されるコマンドで-n
スイッチを使用することによって、によって返される結果の順序は非常に異なる場合があります。sort
comm
comm
Lexographic:-n
スイッチと並べ替えを使用すると、「正の整数」が一連の増加する数値で並べられます。「エラー」はcomm
`sスイッチを使用して抑制できます--nocheck-order
バイトオーダーは:ありませんNOを使用-n switch
してsort
。 コマンドを実行するホストでがLC_COLLATE
どのようにlocale
設定されているかによっても異なる順序を決定します。これは、comm
デフォルトで想定される入力です。詳細についてLC_COLLATE
は、こちらをご覧ください:Reference1およびReference2
エラーは問題ですか?
それはあなたが達成しようとしていることに依存します。あなたは以下の実施例でわかるように、comm
ファイルを比較した後、同じ結果を返すとか、なし sort
`sの-n
彼らの順序がいるかどうかに応じて、上記のように変化しますいえ、スイッチ-n switch
で使用されるsort
コマンド。私自身、「辞書式」の順序付けされた結果を好んでいます。
しかし、あなたがいる場合はありません「の結果を望ん非自筆の」注文、そしてない、NOT使用-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のソート順で返されました。操作は正常に完了しcomm
、-n
スイッチなしで使用した場合と同じ結果が返されましたが、並べ替えられたリストで返されました。
各ファイルに固有の番号のみをリストします。
-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
結果:正しい、スイッチ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
、-n
スイッチを使用して返された結果comm
が間違っていることを意味しません。確かに、使用comm -n
すると、整理された順序で整然とした正解が返されます。
@ dhag、@ kusalananda、@ ChrisDown、さらに拡張が必要な問題を提起してくれてありがとう。私の仕事のレビューをいつもうれしく思います。私たちがより良くなるための唯一の方法は、私たちが仲間から常に押し付けられ、挑戦されている場合です。