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