grep usando un archivo

grep usando un archivo

Tengo 2 archivos y quiero encontrar la diferencia y generar solo lo que no está dentro de ex2

Si uso grep -Ff ex2.txt ex1.txt, me muestra a b c d, si uso el mismo comando -vno hay salida. ¿Por qué también sale el primer comando d?

¿Cuál sería la forma más sencilla de hacer esto? ¿Grep es adecuado para esto? ¿Quizás diff tal vez un script que lea cada línea y genere si está allí o no?

cat ex1.txt
a
b
c
d

cat ex2.txt
a
b
c

Editar---mi salida se muestra así:

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

Respuesta1

grepNo es realmente la herramienta adecuada para el trabajo aquí, pero un vistazo rápido a ella grep manpagedebería ayudar (tenga en cuenta que grepvariará bastante entre distribuciones, ya que algunas pueden usar GNU de forma predeterminada y otras pueden usar otra cosa).

  • -F... Cadenas fijas (separadas por nuevas líneas) - (Categoría: selección de coincidencias)
  • -f ... Nombre de archivo (Categoría: control coincidente)
  • -v ... Invertir coincidencia (Categoría: control de coincidencia)

Entonces, puedes imaginar que algo así grep -Fvf ex2.txt ex1.txtfuncionaría. Sin embargo,esta no es una buena solución, ya que requiere que sepas algo sobre los archivos antes de comenzar. Existen mejores herramientas (como variantes de diff) para brindarle diferencias más específicas y precisas entre archivos y/o directorios.

Editar: cadenas fijas, no cadenas de fuego (al diablo con la autocorrupción)

Respuesta2

Intente cambiar el orden de los archivos:

grep -v -f ex2.txt ex1.txt
> d

Respuesta3

No se puede reproducir su error:

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(en OS X con 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

información relacionada