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.txt
tiene cuatro columnas, file2.txt
tiene 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:
awk
imprime solo el campo 1 defile2.txt
grep -v
invierte la coincidencia (imprime líneas que no coinciden)-f -
indicagrep
leer la lista de patrones de coincidencia de un archivo, en este caso-
(STDIN
), que fue canalizado desdeawk