
Tenho 2 arquivos e quero encontrar a diferença e gerar apenas o que não está dentro do ex2
Se usar grep -Ff ex2.txt ex1.txt
, ele me mostra a b c d
, se eu usar o mesmo comando, -v
não há saída. Por que o primeiro comando também produz d
?
Qual seria a maneira mais fácil de fazer isso? O grep é adequado para isso? Talvez diff talvez um script que leia cada linha e produza se estiver lá ou não?
cat ex1.txt
a
b
c
d
cat ex2.txt
a
b
c
Editar --- minha saída aparece assim:
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
Responder1
grep
não é realmente a ferramenta certa para o trabalho aqui, mas uma rápida olhada no grep manpage
deve ajudar (observe que isso grep
irá variar bastante entre as distribuições, já que algumas podem usar GNU por padrão e outras podem usar outra coisa).
- -F ... Strings fixas (separadas por novas linhas) - (Categoria: seleção de matcher)
- -f ... Nome do arquivo (categoria: controle correspondente)
- -v ... Inverter correspondência (Categoria: controle de correspondência)
Então, você pode imaginar que algo assim grep -Fvf ex2.txt ex1.txt
funcionaria. No entanto,esta não é uma boa solução, pois exige que você já saiba algo sobre os arquivos antes de começar. Existem ferramentas melhores (como variantes de diff
) para fornecer diferenças mais específicas e precisas entre arquivos e/ou diretórios.
Editar: Strings fixas, não Fire strings (auto-corrupção que se dane)
Responder2
Tente alterar a ordem dos arquivos:
grep -v -f ex2.txt ex1.txt
> d
Responder3
Não é possível reproduzir seu erro:
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
Editar(no OS X com 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