¿Cómo comparo todos los files en dir a otro file e imprimo el resultado de líneas comunes?

Primero tengo un dir / que consta de 100 files .txt

john_1.txt , john_2.txt , john_3.txt , john_4.txt etc., que consiste en ej. id;email;name;phone y luego tengo otro file de correo electrónico.txt que consiste en direcciones de correo electrónico enumeradas línea por línea.

¿Cómo comparo todos los files de este file de correo electrónico e imprimo las líneas comunes?

grep o diff ?

Con awk , algo como esto:

 awk -F\; 'NR == FNR {A[$0]=1; next}; A[$2] == 1;' emails.txt john*.txt 

NR == FNR testing si el número de logging (línea) contado en todos los files es el mismo que el número de logging en el file actual, lo cual es una manera divertida de probar si este es el primer file. Si es así, tomamos la lectura de línea completa ( $0 ) y la usamos como key para una matriz asociativa llamada A , estableciendo el valor en uno, y saltando a la next línea de input. Si no era el primer file (no se tomó el salto), tome el segundo campo ( $2 ) en la línea, separado por punto y coma (establecido por -F ) y vea si el valor correspondiente en la matriz A es uno. Si lo es, la acción pnetworkingeterminada es imprimir toda la línea. Podría agregar, por ejemplo, {print $1} para imprimir solo el primer campo.


Con grep puedes hacer

 grep -F -f emails.txt john*.txt 

( -F para patrones de cadena fijos, -f para leer patrones de un file.) Pero esto también imprimirá coincidencias parciales y también coincide con otros campos en el file, pero eso podría no ser un problema con los nombres, numbers de teléfono y correo electrónico. direcciones.

Aunque podría solucionarse agregando punto y coma al inicio y al final de cada línea utilizada como patrón. Esto debería funcionar si se admite la sustitución de processs:

 grep -F -f <(sed -e 's/^/;/' -e 's/$/;/' emails.txt) john*.txt