2012-10-13 198 views
5

Digamos que tengo dos archivos de texto de los que necesito extraer datos. El texto de los dos archivos es la siguiente:¿Cómo comparar dos archivos de texto para el mismo texto exacto usando BASH?

Archivo 1:

1name - [email protected] 
2Name - [email protected] 
3Name - [email protected] 
4Name - [email protected] 

Archivo 2:

email.com 
email.com 
email.com 
anotherwebsite.com 

Archivo 2 es el archivo de 1 lista de nombres de dominio, extraído de las direcciones de correo electrónico Estos no son los mismos nombres de dominio de ninguna manera, y son bastante aleatorios.

¿Cómo puedo obtener los resultados de los nombres de dominio que coinciden con el archivo 2 del archivo 1?

¡Gracias de antemano!

Respuesta

8

Suponiendo que el orden no importa,

grep -F -f FILE2 FILE1 

debe hacer el truco. (Esto funciona debido a un hecho poco conocido: la opción -F de grep no solo significa "hacer coincidir esta cadena fija", significa "hacer coincidir cualquiera de estas cadenas fijas separadas por línea nueva")

+0

Usted es un salvavidas. ¡Gracias! ¿Hay alguna manera de que podamos hacer que esto vuelva a mostrarse en el mismo formato, como Nombre - Dirección de correo electrónico? – user1742682

+0

Imprimirá líneas enteras de FILE1 que contienen cualquiera de las cadenas en FILE2. ¿No es ese el formato que quieres? – zwol

+0

¡Mi error! ¡Funciona bien ahora! Problema con mi formateo. ¡Gracias! : D – user1742682

0

Si obtuve tiene razón, quiere filtrar todas las direcciones con el host mencionado en el archivo 2.

Puede simplemente hacer un bucle sobre File 2 y grep para @<line>, acumulando el resultado en un archivo nuevo o algo similar.

Ejemplo:

cat file2 | sort -u | while read host; do grep "@$host" file1; done > filtered 
+0

¡Correcto! Pero con el formato Name - Email @ ddress utilizado en el Archivo 1. Puede parecer inútil, ¡pero definitivamente tiene un punto para mí! – user1742682

+0

Esto leerá todo el archivo 1 para cada línea en archivo2. Puede hacer el trabajo, pero es muy ineficiente. – jordanm

+0

@jordanm De acuerdo. Estoy a favor de la solución 'grep -f -F'. Traté de ser conceptual. – nemo

2

La receta:

join <(sed 's/^.*@//' file1|sort -u) <(sort -u file2) 

será la salida de la intersección de todos los nombres de dominio en archivo1 y archivo2

1

Ver BashFAQ/036 para la lista de soluciones habituales a este tipo de problema.

1

Utilice el comando VimDIFF, esto le da una buena presentación de la diferencia

+1

Lo encontré mejor que 'grep -F -f FILE2 FILE1' – Totalys

Cuestiones relacionadas