web-dev-qa-db-ja.com

奇妙な動作をするcommコマンド

私は2つのファイルを持っています:

  1. フォルダー内のfindコマンドを使用して生成されたもので、ファイルを一覧表示し、数値で並べ替えてファイルに書き込みます。
  2. もう1つはpythonスクリプトによって生成されたもので、並べ替えられていないため、明示的に数値で並べ替えています。

問題は、私のsort出力に2つの列しかないことであり、次のとおりです。

500016
    500016
500174
    500174
500277
    500277

ご覧のとおり、共通のエントリでさえ2つの列に別々に表示され、3番目の列が完全に欠落しています。これは、2つのファイルに共通するものがないことを意味しますが、これらの最初の3つのエントリは実際には同じです。 sortそれ以外の場合は、私が作成したいくつかのテストファイルで期待どおりに機能します

commでは2つのファイルを字句的にソートする必要があることを知っています。これは、私が試したが失敗したオプションのリストです。

comm <(sort file1.txt) <(sort file2.txt)

から https://unix.stackexchange.com/a/377689/187419 失敗しました。また、sort-dオプションを明示的に指定してみました。また、辞書の並べ替えを使用してファイルを明示的に書き換えようとしました。どちらも機能しませんでした。

comm --check-order <(sort file1.txt) <(sort file2.txt)

from https://unix.stackexchange.com/a/186101/187419 注文エラーは返されませんでした。通常どおり実行され、2つの出力列が表示されました。

この解決策 私の非常に近い問題の場合も機能しません。

ファイル内のいくつかの追加文字が原因である可能性があると考えて、vimで:set listを実行する ここ という解決策もあります。

sortが問題を引き起こしているかどうかをテストするために、作成したテストファイル(以前はcommが機能していた)を意図的に数値で並べ替えましたが、commは引き続き機能しました。

私は見つけた解決策を試しましたが、役に立ちませんでした。他に何か提案はありますか?

1
user128785

各行に文字が追加されているために、対応する行が正確に一致しなくなっていることはほぼ間違いありません。これらの追加文字は、Windowsスタイルのラインターミネータからのキャリッジリターン文字、スペースまたはタブ文字、あるいはその他の非印刷文字の形式である可能性があります。たとえば、Pythonスクリプトは、数字の一部またはすべてに先頭のスペースが含まれるように数字を右揃えにする場合があります。

最も確実なことは、そのような不要な文字をすべて除外することです。データは厳密に数値であるため、たとえばsedを使用すると非常に簡単に実行できます。

sed 's/[^0-9]//g' < input > output

プロセスのさまざまな時点でそれを挿入できます。これが1つだけです:

comm <(sed 's/[^0-9]//g' file1.txt | sort) <(sed 's/[^0-9]//g' file2.txt | sort)
1
John Bollinger