Compare el contenido de dos archivos horizontal y verticalmente

Compare el contenido de dos archivos horizontal y verticalmente

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 9solo 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.txtestá el archivo horizontal y v.txtel 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, printfun encabezado para interpretar commla salida de, brindando los nombres de archivos solicitados, luego ejecútelo commen la entrada ordenada, suprimiendo las líneas que existen en ambos archivos ( -3). Las dos entradas commson sustituciones de procesos donde uso trla sugerencia de don_crissti para convertir espacios en File1nuevas líneas; luego pase ambos archivos sort, lo que commrequiere.

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

información relacionada