GNU/Linux >> Tutoriales Linux >  >> Linux

¿Líneas comunes entre dos archivos?

Esta pregunta ya tiene respuestas aquí :¿Generar las líneas comunes (similitudes) de dos archivos de texto (lo contrario de diff)?

(5 respuestas)
Cerrado hace 3 años.

Tengo el siguiente código que ejecuto en mi Terminal.

LC_ALL=C && grep -F -f  genename2.txt hg38.hgnc.bed > hg38.hgnc.goi.bed

Esto no me da las líneas comunes entre los dos archivos. ¿Qué me estoy perdiendo allí?

Respuesta aceptada:

Utilice comm -12 file1 file2 para obtener líneas comunes en ambos archivos.

Es posible que también necesite que su archivo se clasifique en comm para que funcione como se esperaba.

comm -12 <(sort file1) <(sort file2)

Desde man comm :

-1     suppress column 1 (lines unique to FILE1)
-2     suppress column 2 (lines unique to FILE2)

O usando grep comando que necesita agregar -x opción para hacer coincidir toda la línea como un patrón coincidente. El F la opción le dice a grep ese patrón de coincidencia como una cadena, no una coincidencia de expresiones regulares.

grep -Fxf file1 file2

O usando awk .

awk 'NR==FNR{seen[$0]=1; next} seen[$0]' file1 file2

Esto está leyendo toda la línea de file1 en una matriz llamada seen con la clave como línea completa (en awk el $0 representan toda la línea actual).

Usamos NR==FNR como condición para ejecutar su bloque seguido solo para la primera entrada fle1 no archivo2 , porque NR en awk consulte el número de línea de procesamiento actual y FNR se refiere al número de línea actual en all entradas. entonces NR es único para cada archivo de entrada pero FNR es único para todas las entradas.

El next hay algo que dice awk no continúe el código de descanso y comience de nuevo hasta NR no es igual a FNR eso significa todas las líneas de file1 leído por awk .

Luego, el próximo seen[$0] solo se ejecutará para el segundo file2 y para cada línea en file2 buscará en la matriz e imprimirá esa línea donde existe en la matriz.

Otra opción sencilla es usar sort y uniq :

sort file1 file2|uniq -d

Esto imprimirá ambos archivos ordenados y luego uniq -d imprimirá solo líneas duplicadas. PERO esto se otorga cuando NO hay líneas duplicadas en ambos archivos; de lo contrario, siempre se otorga a continuación, incluso si hay líneas duplicadas en ambos archivos.

uniq -d <(sort <(sort -u file1) <(sort -u file2))

Linux
  1. ¿Imprimir líneas entre (y excluyendo) dos patrones?

  2. ¿Cómo sincronizar archivos entre dos controles remotos?

  3. Salida de las líneas comunes (similitudes) de dos archivos de texto (el opuesto de diff)?

  4. Linux:¿cómo eliminar archivos creados entre dos veces?

  5. ¿Extraer texto entre dos líneas específicas?

Cómo transferir archivos entre dos computadoras usando los comandos nc y pv

Cómo comparar dos archivos en la terminal de Linux

Cómo Rsync archivos entre dos servidores Linux automáticamente

Diferencia en espacios en blanco entre dos archivos en Linux

¿Cómo eliminar archivos creados entre dos veces?

Cómo copiar una gran cantidad de archivos rápidamente entre dos servidores