
У меня есть 2 файла, и я хочу найти разницу и вывести только то, чего нет в ex2
Если использовать grep -Ff ex2.txt ex1.txt
, он мне показывает a b c d
, если я использую ту же команду с -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
решение1
grep
на самом деле не совсем подходящий инструмент для данной работы, но быстрый взгляд на него grep manpage
должен помочь (обратите внимание, что он grep
будет немного отличаться в зависимости от дистрибутивов, так как некоторые могут использовать GNU по умолчанию, а другие могут использовать что-то другое).
- -F ... Фиксированные строки (разделенные символами новой строки) - (Категория: выбор сопоставителя)
- -f ... Имя файла (Категория: контроль соответствия)
- -v ... Инвертировать соответствие (Категория: управление соответствием)
Итак, вы можете представить, что что-то вроде этого grep -Fvf ex2.txt ex1.txt
сработает. Однако,это не хорошее решение, так как это требует от вас уже знать что-то о файлах до начала. Существуют лучшие инструменты (например, варианты diff
), которые дадут вам более конкретные и точные различия между файлами и/или каталогами.
Редактировать: Исправлены строки, а не строки Fire (к черту автоповреждение)
решение2
Попробуйте изменить порядок файлов:
grep -v -f ex2.txt ex1.txt
> d
решение3
Невозможно воспроизвести вашу ошибку:
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