У меня есть 2 файла, и я хочу найти разницу и вывести только то, что не находится внутри ex2
Если использовать grep -Ff ex2.txt ex1.txt
, он покажет мне abcd
, если я использую ту же команду с -v
, вывода не будет. Почему с первой командой также выводится d
?
Каким будет самый простой способ сделать это? Подходит ли для этого grep? Может быть, diff, может быть, скрипт, который будет читать каждую строку и выводить, есть ли она или нет?
cat ex1.txt
a
b
c
d
cat ex2.txt
a
b
c
Редактировать - мои выходные данные выглядят следующим образом:
cat ex2.txt
a
b
c
cat ex1.txt
a
b
c
d
grep -vf ex2.txt ex1.txt
grep -f ex2.txt ex1.txt
a
b
c
d
Невозможно воспроизвести вашу ошибку:
cat ex2.txt
a
b
c
cat ex1.txt
a
b
c
d
grep -vf ex2.txt ex1.txt
d
grep -f ex2.txt ex1.txt
a
b
c
grep -Ff ex2.txt ex1.txt
a
b
c
grep -vFf ex2.txt ex1.txt
d
grep -V
grep (GNU grep) 2.20
lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 8.5 (jessie)
Release: 8.5
Codename: jessie
Изменить (в OS X с BSD grep):
cat ex2.txt
a
b
c
cat ex1.txt
a
b
c
d
grep -f ex2.txt ex1.txt
a
b
c
grep -vf ex2.txt ex1.txt
d
grep -Ff ex2.txt ex1.txt
a
b
c
grep -v -Ff ex2.txt ex1.txt
d
grep -V
grep (BSD grep) 2.5.1-FreeBSD
grep
не совсем подходящий инструмент для этой работы, но беглый просмотр справочной страницы grep
должен помочь (обратите внимание, что grep
] будет полудикие различаться между дистрибутивами, так как некоторые могут использовать GNU по умолчанию, а другие могут использовать что-то еще).
Итак, вы можете представить, что подойдет что-то вроде grep -Fvf ex2.txt ex1.txt
. Однако это не лучшее решение , так как оно требует, чтобы вы уже кое-что знали о файлах перед запуском. Существуют более эффективные инструменты (например, варианты diff
), чтобы дать вам более конкретные и более точные различия между файлами и / или каталогами.
Редактировать: Фиксированные строки, а не Огненные строки (черт побери, автоповреждение)