comm:ファイルがソートされていません


9

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

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

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


私の場合、小文字の大文字と小文字を区別するnotepad ++を使用してファイルをソートしました(辞書順の昇順)。「Z」の後に昇順で表示されます。これは、並べ替えユーティリティ(bash)の並べ替え方法とは異なります。これを確認するために、すべての行を大文字に変換し、np ++でソートしたところ、commは文句を言わなくなりました。
Sahil Singh

回答:


10

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

1
2000
300

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

1
300
2000

これを修正すれば、問題はなくなるはずです。難解な場合のためcommのロケールがとは異なる可能性がsortロケール、あなたが実行したいことsortcommLC_COLLATE=C、その環境でのネイティブのバイト順序を使用します。


数値ソートを行う方法は?
ウェンジ

4
@wenzisort -n
Gilles 'SO-

非自筆の順序は、」番号の場所シリーズですINCREASE:あなたはあなたの答えで後方にそれを持っているseeries-注文でmathworld.wolfram.com/LexicographicOrder.html。使用比較私の下の解答者のテスト結果を参照してくださいsort として、なし-nスイッチのみを示してい-n、あなたが正しい達成することができますスイッチを増やすご了承順序は、あなた自身の答えで必要とされます。
F1Linux

@ F1Linuxなに?comm文字通りLC_COLLATEd順序が必要です。答えのエラーは、テストセット以外の例では純粋に表面的なものではないというだけで十分です...正の数値によるソートは要求されませんでした。
クリスダウン

私はツー応答したことをあなたの答え@ChrisDownない私が編集しただけまし参照1 NOW「に言及LC_COLLATEは」だった:「COMM はliterallexicographicソート、数値ではないソートを望んでいる、これを修正して、問題が離れて行く必要があります。」今どこ"LC_COLLATE"については、 "_ Lexographic"ソートとはまったく異なる獣が含まれていました。確かに、あなたの最初の答えは、例を含まない1行でまばらで、私自身の答えで質問を再訪するように促しました。お気づきのように、ここでは「LC_COLLATE」が確実に機能するため、更新された回答を賛成しています。
F1Linux

0

更新された回答:

問題:

を使用して、テキストではなくファイル内の正の整数を比較すると、OPは「ファイルがソートされていない」というエラーを受け取ります。したがって、10進数以外の数値を扱っています。comm

簡潔な答え:

に提供される結果をソートするために使用されるコマンドで-nスイッチを使用することによって、によって返される結果の順序は非常に異なる場合があります。sortcommcomm

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

結果:正しいが、ソートされていない順序で返される

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のソート順で返されました。操作は正常に完了しcomm-nスイッチなしで使用した場合と同じ結果が返されましたが、並べ替えられたリストで返されました。

違い

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

-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

結果:正しい、スイッチ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-nスイッチを使用して返された結果commが間違っていることを意味しません。確かに、使用comm -nすると、整理された順序で整然とした正解が返されます。

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


トップ投票の回答は、「commは辞書式ソートを望んでいる」と述べていますが、数値的にソートしているように見えます。場合によっては落ちるようです。
dhag

再びそのソート異なる数値と辞書番号のテスト、等1000年、200、30、4
Kusalananda

@Kusalananda私の更新された回答にあなたのとても親切で有益なフィードバックを組み込んだだけです。あなたのフィードバックを最も義務付けています!
F1Linux

@dhagが私の回答を更新して、あなたとKusalanadaのフィードバックを組み込みました。時間と労力を
費やし

1
@JeffSchaller私が最初に回答した回答では、Chrisの新しく修正された回答のような「LC_COLLATE」ではなく、「Lexographic」ソートについて言及していました。私は正しいとクリスに答え、彼の更新された答えを支持しました。「Lexographic」と「LC_COLLATE」は別の獣です。ありがとうJeff-
F1Linux
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.