ほぼ同じファイルが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
、線の出現順序は重要また、-x
grepコマンドにオプションが含まれていないため、部分一致出力から除外されます。
再現可能な例
次の 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
より多くのコンテキストが生成され、出力が理解しやすくなります。