希望する結果を示すコミュニケーションの問題

希望する結果を示すコミュニケーションの問題

ここでは、commを使用して2つのソートされた(ソートされた)ファイルを比較し、1つまたは両方のファイルにある行/レコードを表示する方法を学びました。
実際に何かが期待どおりに機能しなかったので、助けが欲しいです。

それぞれ約 200,000 個のレコードを持つ複数のソートされたファイルがあり、一部の行は共通です。以前にソートされた両方のファイルに表示されます。次に、次のコマンドを実行します。

comm -i -23 file1 file2 > test_01

とても簡単です。 test_01にレコード/行があると予想されます。ただfile1に表示されます。ただし、出力(test_01)には、両方のファイルに存在する行/レコードが含まれています。

両方のファイルには通常の電子メールアドレス(1列あたり1列)のみが含まれています。前述のように、以前はソートユーティリティを使用してソートが行われていました。各ファイルには異なるレコード数があります。 test_01出力ファイルにfile1とfile2に存在するレコードが含まれていることを確認してください(grepを使用)。

上記のプロセスの説明によると、私が何か間違っているのでしょうか?

答え1

次の例を考えてみましょう。

$ comm -23 L R > Z
$ head -n 9999 L R Z
==> L <==
Easy one
Easy one
Final Two

==> R <==
Easy one
Final Two

==> Z <==
Easy one
$ 

Easy oneテキストが両方のファイルに表示されても、「のみ」を含む列1が一覧表示されます。ペアは一致し、2 番目のペアはファイル L でのみ追加されます。 3つの列をすべてリストすると、これは明らかになります。

$ comm L R
        Easy one
Easy one
        Final Two
$ 

Linuxではこのオプションをテストできませんでしたが、うまくいかないと-i疑う理由はありません。ただし、入力を大文字と小文字でソートしてから大文字と小文字を区別せずに比較するオプションはsortありません。-i

tr 'a-z' 'A-Z' | sort | uniq違いを確認する前に、各ファイルを渡すことをお勧めします。comm

実際のデータの数行を表示し、数行だけを使用して例を分けることができれば便利です。スペース(スペース、タブ、CR)は結果に微妙に影響を与える可能性があります。

awkより良い選択かもしれません。配列を使用すると、ソートされていないデータを比較し、空白のバランスをとり、大文字と小文字を無視し、元の行番号とデータを報告し続けることができます。

関連情報