
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 -v
no 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
grep
No es realmente la herramienta adecuada para el trabajo aquí, pero un vistazo rápido a ella grep manpage
debería ayudar (tenga en cuenta que grep
variará 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.txt
funcionarí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