2つのファイルの比較

2つのファイルの比較

主な部分は似ていますが、混乱している2つのファイルを比較する方法を提案してください。例:

A file持つ

72444 55555
72445 55666
55666 72446

B File持つ

72444 55555
55666 72446
72445 55666
xxxxx yyyyy

そのため、出力ファイルファイルとエラーが発生したファイル名の違いを取得したいと思います。上記の残りの部分が同じであれば、おそらく次のようになります。

B File xxxxx yyyyy

答え1

このcommユーティリティは、2つのファイルのいずれかに固有であるか、または両方のファイルに共通の行を抽出できます。このユーティリティを使用するには両方のファイルを並べ替える必要があるため、「複雑な行」の問題が解決されます。

ユーティリティcommのデフォルト出力は、タブで区切られた3つの列で構成されています。

  1. 最初のファイルでのみ行が見つかります。
  2. 2番目のファイルでのみ行が見つかります。
  3. 両方のファイルで行が見つかりました。

列を有効-1または無効にできます。-2-3

ここでは、2つのプロセス置換を使用してソートされた入力データを生成し、2つのファイルに固有のデータであるcomm最初の2つの列のみを表示するように要求します。

$ comm -3 <(sort fileA) <(sort fileB)
        xxxxx yyyyy
$ comm -3 <(sort fileA) <(sort fileB) | cut -f 2-
xxxxx yyyyy

見てわかるように、2番目の列は何かを含む唯一の列なので、この行はxxxxx yyyyyのみに表示されfileB、他のすべての行は2つのファイルに共通であると結論付けることができます。

それ以外の場合は、3-3番目の列でも共通点を確認できます。

$ comm <(sort fileA) <(sort fileB)
                55666 72446
                72444 55555
                72445 55666
        xxxxx yyyyy

答え2

の場合、zsh配列減算演算子を使用できます。

$ a='A file' b='B file'
$ al=( ${(f)"$(<$a)"} ) bl=( ${(f)"$(<$b)"} )
$ print -rC1 -- "$a "${^al:|bl} "$b "${^bl:|al}
B file xxxxx yyyyy

どこ:

  • $(<file)file改行なしでコンテンツに拡張
  • ${(f)expansion}空の要素を捨てて新しい行に分割するため、それぞれに空でない行が$al含まれます。$blA fileB file
  • ${a:|b}(配列減算)aにも含まれる要素(バー)を除いて、配列要素に展開されます。b
  • text${^array}代わりarray=(a b)に拡張する場合、ここでは配列減算結果の要素にファイル名プレフィックスを使用します。texta textbtexta b
  • print -rC1 -- print列sの各パラメータraw1 C

両方のファイルに同じ行が複数回表示される場合、2つのファイルの発生回数が異なる場合でも報告されません。

関連情報