Compara dos archivos según la primera columna

Compara dos archivos según la primera columna

Tengo dos archivos y me gustaría obtener un archivo nuevo con solo las líneas que tenemos en el primer archivo, pero no en el segundo. Ejemplo:

archivo1:

ID      firstname        lastname
1       John             Wilkens
2       Andrea           Smith
3       Matthew          Freberg
4       Brenda           Something

archivo2:

ID      firstname        lastname
1       John             Wilkens
2       Andrea           Willems
3       Jay              Freberg
5       Mike             Hart

Producción:

ID      firstname        lastname
4       Brenda           Something

Intenté usar comm, pero eso también proporciona las filas donde se cambió algo, por ejemplo, los ID 2 y 3.

¿Puedes ayudarme con esto?

Respuesta1

$ awk 'NR==FNR{a[$1]; next} FNR==1 || !($1 in a)' file2 file1
ID      firstname        lastname
4       Brenda           Something
  • NR==FNR{a[$1]; next}Utilice la primera columna file2para crear claves de matriz
    • NRmantiene un seguimiento del número total de registros leídos hasta el momento, FNRtiene el número de registro solo para el archivo actual que se está leyendo. Por lo tanto, NR==FNRes cierto sólo para el primer archivo (suponiendo que no esté vacío)
  • FNR==1 || !($1 in a)para file1el archivo, imprima la línea del encabezado o si la primera columna no se encuentra en la matriza
  • Úselo awk -F'\t' '...'si su entrada está separada por tabulaciones y awk -F, '...'si está separada por comas.

Si el primer archivo puede estar vacío, use esto:

awk '!f{a[$1]; next} FNR==1 || !($1 in a)' file2 f=1 file1

Esto establecerá una bandera fentre los dos archivos.

Respuesta2

En una línea de comando bash puedes hacer lo siguiente. Filtre los ID del archivo 2 y búsquelos en el archivo 1, pero solo al comienzo de la línea:

$ grep -vf <(< file2 tail -n+2 | grep -Eo '^[^ ]{1,}'|sed 's/.*/^& /') file1
ID      firstname        lastname
4       Brenda           Something

información relacionada