Comparar dos columnas de archivos

Comparar dos columnas de archivos

Tengo archivos de texto largos con campos delimitados por espacios:

cat file1.txt
Id    leng  sal   mon
25671 34343 56565 5565
44888 56565 45554 6868
23343 23423 26226 6224
77765 88688 87464 6848
66776 23343 63463 4534

cat file2.txt
Id    number
25671 34343 
76767 34234 
23343 23423 
66776 23343 

cat output.txt
Id    leng  sal   mon
44888 56565 45554 6868
77765 88688 87464 6848

file1.txttiene cuatro columnas, file2.txttiene dos columnas. Quiero comparar la primera columna ( $1) en ambos archivos ( file1.txt, file2.txt) y generar el archivo que no coincide file2.txt.

Yo he tratado

join -v1 file1.txt file2.txt >output.txt

Pero el resultado tiene algunos errores. Se agradece cualquier comando awk/ .sed

Respuesta1

Para poder utilizar join, debe asegurarse de que ARCHIVO1 y ARCHIVO2 esténordenadoen los campos de unión.

El siguiente comando debería funcionar:

join -v1 <(sort file1.txt) <(sort file2.txt)

Respuesta2

Así, pero no incluye la línea de encabezado:

$ awk '{print $1}' file2.txt | grep -vf - file1.txt
44888 56565 45554 6868
77765 88688 87464 6848

Nota: Ajusté esto para que coincida con el resultado del ejemplo, no con su descripción. Si lo desea al revés, simplemente cambie archivo1 y archivo2.

Desglosando esto:

  • awkimprime solo el campo 1 defile2.txt
  • grep -vinvierte la coincidencia (imprime líneas que no coinciden)
  • -f -indica grepleer la lista de patrones de coincidencia de un archivo, en este caso -( STDIN), que fue canalizado desdeawk

información relacionada