Usando algunas utilidades menos conocidas:
sort file1 > file1.sorted
sort file2 > file2.sorted
comm -1 -3 file1.sorted file2.sorted
Esto generará duplicados, por lo que si hay 1 3 en file1 , pero 2 en file2 , esto seguirá generando 1 3 . Si esto no es lo que desea, canalice la salida desde sort hasta uniq antes de escribirlo en un archivo:
sort file1 | uniq > file1.sorted
sort file2 | uniq > file2.sorted
comm -1 -3 file1.sorted file2.sorted
Hay muchas utilidades en el paquete GNU coreutils que permiten todo tipo de manipulaciones de texto.
$ awk 'FNR==NR {a[$0]++; next} !($0 in a)' file1 file2
6
7
Explicación de cómo funciona el código:
- Si estamos trabajando en el archivo 1, realice un seguimiento de cada línea de texto que vemos.
- Si estamos trabajando en el archivo 2 y no hemos visto el texto de la línea, imprímalo.
Explicación de detalles:
FNRes el número de registro del archivo actualNRes el número de registro general actual de todos los archivos de entradaFNR==NRes cierto solo cuando estamos leyendo el archivo1$0es la línea de texto actuala[$0]es un hash con la clave establecida en la línea de texto actuala[$0]++rastrea que hemos visto la línea de texto actual!($0 in a)es verdadero solo cuando no hemos visto el texto de la línea- Imprime la línea de texto si el patrón anterior devuelve verdadero, este es el comportamiento predeterminado de awk cuando no se da ninguna acción explícita