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:
FNR
es el número de registro del archivo actualNR
es el número de registro general actual de todos los archivos de entradaFNR==NR
es cierto solo cuando estamos leyendo el archivo1$0
es 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