2009-04-03 14 views
26

Tengo dos archivos en los que algunas de las líneas han cambiado de orden. Me gustaría poder comparar estos.¿Cuál es una manera fácil de hacer una diferencia ordenada entre dos archivos?

Un sitio web sugirió algo que se parece a esto:

diff <(sort text2) <(sort text1) 

Pero esto produce el error: Falta el nombre de redirección.

Estoy usando tcsh. Es el comando de arriba para un shell diferente?

¿Hay una manera mejor?

+2

Algunos shell (zsh seguro, bash puede estar) hacen esta magia permitiendo que la salida de un comando aparezca como un nombre de archivo en otro comando usando el dispositivo/dev/fd . – vrdhn

+2

http://tldp.org/LDP/abs/html/process-sub.html – vrdhn

Respuesta

39

Esta redirección es fiesta específica. Por lo tanto, no funcionará en tcsh.

Puede llamar a bash y especificar el comando directamente:

bash -c 'diff <(sort text2) <(sort text1)' 
+0

Este es un gran consejo, pero no entiendo completamente por qué funciona. ¿Podría explicarnos cómo envolverlo con "bash -c" hace que la redirección funcione? – rooskie

+0

@rooskie: ¿mejor? –

+1

+1 agradable, rápido, al punto –

1

El problema con su 'diff' publicado es que diff sólo puede recibir uno archivo a través de stdin. Así que creo que tendrás que escribir al menos un archivo ordenado en un archivo temporal.

diff - file.txt 

diferirán en comparación con un archivo.txt. El '-' representa stdin

EDITAR: Supuse que la sustitución del proceso funcionaría a través de stdin. Pero ese no es el caso y lo anterior va a través de /dev/fd/{num} como lo señala VardhanDotNet arriba.

3

Si esto no funciona para su cáscara, sólo lo hacen en 3 líneas: la sintaxis

sort text1 > text1.sorted 
sort text2 > text2.sorted 
diff text1.sorted text2.sorted 

simple pero debería funcionar ...

10

He aquí una función para la que:

function diffs() { 
     diff "${@:3}" <(sort "$1") <(sort "$2") 
} 

Llámelo como esto:

diffs file1 file2 [other diff args, e.g. -y] 

Es de suponer que podría alterar según la respuesta de David Schmitt si es necesario.

+3

¡Me encanta! Simplemente lo puse mi .bashrc. Es un milagro que nadie más haya votado esto todavía. +1 – refi64

Cuestiones relacionadas