主な部分は似ていますが、混乱している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つの列で構成されています。
- 最初のファイルでのみ行が見つかります。
- 2番目のファイルでのみ行が見つかります。
- 両方のファイルで行が見つかりました。
列を有効-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
含まれます。$bl
A file
B file
${a:|b}
(配列減算)a
にも含まれる要素(バー)を除いて、配列要素に展開されます。b
text${^array}
代わりarray=(a b)
に拡張する場合、ここでは配列減算結果の要素にファイル名プレフィックスを使用します。texta
textb
texta
b
print -rC1 --
print
列sの各パラメータr
aw1
C
両方のファイルに同じ行が複数回表示される場合、2つのファイルの発生回数が異なる場合でも報告されません。