¿Coincidencia de dos archivos, línea por línea?

¿Coincidencia de dos archivos, línea por línea?

Tengo dos archivos que constan de números. Ahora, quiero hacer coincidir la línea del primer archivo con toda la línea del segundo archivo y aumentar el contador si se encuentra la coincidencia. ¿Cómo escribir el script bash para esto?

file1:
1
2
3
4
5
6
file2:
2
3
6
10
12
13
23
counter = 3

Respuesta1

Suponiendo file1.txty file2.txttenemos conjuntos de números como este:

file1.txt:

1
2
4
6
7

file2.txt:

2
6
7
8
9

Podrías probar un par de enfoques dependiendo de lo que quieras hacer con los datos o de qué más quieras recopilar a lo largo del camino.

  • Grep puede buscar en un archivo una cadena de patrón. Los patrones se pueden suministrar usando otro archivo usando la -fbandera. La -xbandera también se asegura de que solo encuentre coincidencias de líneas completas para que un patrón de '2' no coincida con '24'. Finalmente la -cbandera cuenta el número de coincidencias. Poniéndolo todo junto tendrías:

    grep -x -c -f file1.txt file2.txt
    
  • Si quisiera hacer otras cosas con los números a lo largo del camino para obtener un recuento total, podría adoptar un enfoque más manual:

    counter=0
    while read number; do
        grep -q -x "$number" file2.txt && let counter=$counter+1
    done < file1.txt
    echo $counter
    

    Esto es mucho menos eficiente ya que está leyendo file2.txt nuevamente para cada línea en file1.txt, pero si también quisiera hacer otras cosas con el número o manipular el archivo a lo largo del camino, sería más fácil parchear un bucle como eso. No se utiliza el -qindicador, por lo que grep guarda silencio y solo devuelve un código de salida. Usando ese código podemos saber si se encontró una coincidencia o no y solo incrementar el contador si así fuera.

Cualquier forma en que trabaje esto, asegúrese de tener en cuenta la posibilidad de que algunas líneas sean coincidencias parciales para números que son subcadenas de otros números. También debes pensar en lo que quieres que suceda si hay más de una coincidencia por línea. ¿Cada duplicado incrementa el contador o eso solo sucede una vez? ¡Tenga en cuenta que las dos opciones anteriores manejan esto de manera diferente! Para algunos conjuntos de datos darán resultados diferentes. Si quisieras que dieran los mismos resultados, se podrían adaptar ambas técnicas. Por ejemplo, el primero podría verificar una versión del archivo en la que se hayan eliminado todos los duplicados para que nada coincida más de una vez:

 grep -x -c -f <(sort -u file1.txt) <(sort -u file2.txt)

información relacionada