grep usando um arquivo

grep usando um arquivo

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, -vnã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

grepnão é realmente a ferramenta certa para o trabalho aqui, mas uma rápida olhada no grep manpagedeve ajudar (observe que isso grepirá 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.txtfuncionaria. 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

informação relacionada