
Tengo dos archivos:
El archivo 1 tiene el siguiente contenido:
1 2 3 4 5 6 7 8 10
File2 tiene el siguiente contenido:
1
2
3
4
5
6
7
8
9
10
¿Cómo puedo encontrar la diferencia entre dos archivos e imprimir el número impar y también decir de qué archivo es?
Por ejemplo, en este caso 9
solo aparece en Archivo2, entonces, ¿cómo puedo ejecutar un comando y obtener resultados en la línea de
9 is only in File2
Respuesta1
Si tiene un formato limpio (espacio x nueva línea), lo más fácil es transformar la línea en filas y simplemente diferenciarlas, así:
diff <( sed -e "s/ /\n/g" h.txt ) v.txt
¿Dónde h.txt
está el archivo horizontal y v.txt
el archivo vertical?
Respuesta2
Es posible que desee utilizar (G)AWK:
Para encontrar diferencias, use AWK para convertir file1.txt a una representación línea por línea primero, luego canalice el resultado a diff:
gawk 'BEGIN {FS = " "} ; {for(i=1; i<=NF; i++) print $i}' file1.txt | diff file2.txt -
Respuesta3
Hay más de una forma de hacerlo; aquí está comm
.
Primero, printf
un encabezado para interpretar comm
la salida de, brindando los nombres de archivos solicitados, luego ejecútelo comm
en la entrada ordenada, suprimiendo las líneas que existen en ambos archivos ( -3
). Las dos entradas comm
son sustituciones de procesos donde uso tr
la sugerencia de don_crissti para convertir espacios en File1
nuevas líneas; luego pase ambos archivos sort
, lo que comm
requiere.
printf "File1\tFile2\n"; comm -3 <(tr ' ' '\n' < File1 | sort) <(sort File2)
Ejecución de muestra
Archivo de entrada 1:
1 2 3 4 5 6 7 8 10 11
Archivo de entrada 2:
1
2
3
4
5
6
7
8
9
10
Producción:
$ printf "File1\tFile2\n"; comm -3 <(sed 's/ /\n/g' File1 |sort ) <(sort File2)
File1 File2
11
9