パターンファイルを使用した逆 grep では一致しない部分が表示されない

パターンファイルを使用した逆 grep では一致しない部分が表示されない

ほぼ同じファイルが2つあります。「foo」と「bar」

各ファイルには数千の行があり、各行に 1 つの番号が付いています。

sort両方のファイルを実行すると、diff結果は次のようになります。

$ diff foo bar
5984a5985,5986
> 15676
> 15677
7703,7706d7704
< 17486
< 17487
< 17488
< 17489

ただし、grep -Fvf両方のファイルの場合、両方向で「不一致」はゼロになります。

$ grep -Fvf foo bar
$ grep -Fvf bar foo
$

それはなぜでしょうか? diff と同様の結果が得られるべきではないでしょうか? 最初のコマンドは diff の値の「前半」を返し、2 番目の grep コマンドは残りを返すことを期待します。

期待した結果が得られないのはなぜですか?

答え1

の場合diff、 とは異なりgrep -Fvf線の出現順序は重要また、-xgrepコマンドにオプションが含まれていないため、部分一致出力から除外されます。

再現可能な例

次の 2 つのファイルを考えてみましょう。

$ cat foo
156
174
15676
17486
17487
$ cat bar
15677
15678
156
174
15676

コマンドは出力を生成しませんが、コマンドdiffはそれらが異なることを示します。grep

$ diff foo bar
0a1,2
> 15677
> 15678
4,5d5
< 17486
< 17487
$ grep -Fvf foo bar; grep -Fvf bar foo

-x完全な行の一致を要求するように追加した場合、grep は次を生成します。

$ grep -Fvxf foo bar
15677
15678
$ grep -Fvxf bar foo
17486
17487

追加の提案

として可能コメントで提案されているように、diff -uより多くのコンテキストが生成され、出力が理解しやすくなります。

関連情報