を実行すると、grep -m 1 -Fnxvf file1 file2
一部のファイルでは実行時とは異なる行番号が表示されますgrep -m 1 -Fnxvf file2 file1
(ファイル交換)。
なぜ?
ファイルを最小限の例に縮小しました。
ファイル1
Pp: 1 Id pezzo 193 posIn = { x = 132, y = 1432 }
Pp: 1 Id pezzo 193 posIn = { x = 136, y = 1432 }
Pp: 1 Id pezzo 193 posIn = { x = 84, y = 1436 }
Pp: 1 Id pezzo 193 posIn = { x = 88, y = 1436 }
ファイル2
Pp: 1 Id pezzo 193 posIn = { x = 132, y = 1432 }
Pp: 1 Id pezzo 193 posIn = { x = 84, y = 1436 }
Pp: 1 Id pezzo 193 posIn = { x = 88, y = 1436 }
Pp: 1 Id pezzo 193 posIn = { x = 92, y = 1436 }
私が得た結果は次のとおりです。
$ grep -m 1 -Fnaxvf file2 file1
2:Pp: 1 Id pezzo 193 posIn = { x = 136, y = 1432 }
$ grep -m 1 -Fnaxvf file1 file2
4:Pp: 1 Id pezzo 193 posIn = { x = 92, y = 1436 }
最初の結果は私が予想したものと正確に一致しますが、2番目のケースでは(通常はそうです)file2
。
長い説明
2つのファイル間の最初の違いを見つけて表示しようとしています。見せたいただ最初の違いとその違いが発生する場所です。
見つけました。これSO応答(答えに対する私のコメントを参照)はうまくいくようですが、いくつかのファイルでは上記の奇妙な動作が見つかりました。
答え1
TLDR:grepがパターンを順番に使用することを保証することはできません。
次の内容を含む2つのファイルがあるとしましょう(1行に1文字ずつ、読みやすくするために折り畳みました)。
ファイル1
A B D E
そして
ファイル2
A B C D
- ファイル1のグループ2(ABCD)から最初に除外された(-vを使用したため)、文字はEです。
- ファイル2のセット1から除外される最初の文字はCです。
ファイルの比較は通常次のとおりです。
cmp file1 file2
バイナリファイルの場合、diffに気にしない場合(cmp -s(自動)を使用することもできます)diff file1 file2
file1からfile2までの疑似sedコードを示します(diff file2 file1は非常に対称です)。comm -123 file1 file2
file1(-1) および file2(-2) に共通行(-3)を表示