Compare dos archivos planos A y B para ver si todos los registros en B también existen en A

Compare dos archivos planos A y B para ver si todos los registros en B también existen en A

Tengo dos archivos planos A y B. A es un archivo grande que tiene millones de registros y se supone que B es un subconjunto de A. A tiene 20 columnas con una clave única y B tiene 5 columnas con la misma clave única. ¿Podría decirme cómo comparar B con A y averiguar si los registros presentes en el archivo B también están presentes en el Archivo A y tienen los mismos datos en las columnas respectivas?

Respuesta1

Creé dos archivos para demostrar mis comandos.

file1:

1 a1 b1 c1 d1 e1
2 a2 b2 c2 d2 e2
3 a3 b3 c3 d3 e3
4 a4 b4 c4 d4 e4
5 a5 b5 c5 d5 e5

file2:

2 b2 c2 e2
4 b4 c4 xx
5 b5 c5 e5

La primera columna es la clave única. Las columnas comunes son column by c. eLas filas comunes son 2y . La fila tiene un valor diferente en la columna .454e

Aquí está el comando con salida:

$ comm -1 -3 <(cut -d' ' -f1,3,4,6 file1) file2
4 b4 c4 xx

Si los archivos aún no están ordenados, puedes hacerlo así:

$ comm -1 -3 <(cut -d' ' -f1,3,4,6 file1 | sort) <(sort file2)

Explicación:

cut -d' ' -f1,3,4,6 file1

Imprima los campos número 1, 3, 4 y 6 del archivo. Los campos están separados por espacios. Si los campos están separados por comas, utilícelos cutasí:cut -d','

<( ... )

Sustitución de procesos

comm -1 -3 file1 file2

Imprime líneas exclusivas del archivo 2.

Advertencias:

cutTendrá problemas si el carácter separador puede aparecer como un carácter en un campo.

Por ejemplo:

"field1","field2,stillfield2","field3"

cutNo entenderá que la coma en "field2,stillfield2"es parte del campo.

Si sus archivos son así, tal vez sea mejor utilizar un lenguaje de programación con manejo de CSV incorporado. Por ejemplopitón.

Respuesta2

Si los archivos tienen columnas diferentes como usted dice, la forma más sencilla podría ser escribir un pequeño programa utilizando el lenguaje de su elección. diffy commno será de mucha ayuda si la estructura de líneas en los archivos no es idéntica.

Respuesta3

Aparte de la solución commy diffque podrías utilizar greppara esto.
Suponiendo que sus datos relevantes son las columnas 1,3 y 10 en el archivo A y 1,2 y 3 en el archivo B. Usamos cutpara seleccionar las columnas de A, usamos esto como archivo de coincidencia de palabras clave y verificamos su presencia en el archivo B. Si el archivo B tiene una línea que no está presente en las líneas coincidentes extraídas del archivo A, se mostrarán. Si todo coincide, no hay salida (ya que B supuestamente es un subconjunto de A)

grep -wvf <( cut -f1,3,10 fileA ) fileB

O si el archivo B tiene más de tres columnas:

grep -wvf <( cut -f1,3,10 fileA ) <( cut -f1,2,3 fileB )

información relacionada