У меня есть два почти одинаковых файла,"фу" и "бар".
Каждый файл содержит тысячи строк, по одному числу в каждой строке.
Если я 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, а вторая команда grep вернет мне остальное.
Почему я не получаю ожидаемых результатов?
решение1
В diff
отличие от grep -Fvf
,порядок появления строк имеет значение. Кроме того, поскольку -x
опция не была включена в команду grep, строки с одним толькочастичные совпаденияисключаются из вывода.
Воспроизводимый пример
Рассмотрим эти два файла:
$ 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
создают больше контекста, который может сделать вывод более понятным.