
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 columnafile2
para crear claves de matrizNR
mantiene un seguimiento del número total de registros leídos hasta el momento,FNR
tiene el número de registro solo para el archivo actual que se está leyendo. Por lo tanto,NR==FNR
es cierto sólo para el primer archivo (suponiendo que no esté vacío)
FNR==1 || !($1 in a)
parafile1
el 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 yawk -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 f
entre 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