web-dev-qa-db-fra.com

Quel est un moyen facile de faire un diff trié entre deux fichiers?

J'ai deux fichiers dans lesquels certaines lignes ont changé d'ordre. J'aimerais pouvoir les comparer.

Un site Web a suggéré quelque chose qui ressemble à ceci:

diff <(sort text2) <(sort text1)

Mais cela donne l'erreur: Nom manquant pour la redirection.

J'utilise tcsh. La commande ci-dessus est-elle pour un autre shell?

Y a-t-il une meilleure façon?

38
mmccoo

Cette syntaxe de redirection est spécifique à bash. Ainsi, cela ne fonctionnera pas dans tcsh.

Vous pouvez appeler bash et spécifier directement la commande:

bash -c 'diff <(sort text2) <(sort text1)'
56
David Schmitt

Voici une fonction pour cela:

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

Appelez ça comme ceci:

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

Vraisemblablement, vous pouvez le modifier selon la réponse de David Schmitt si nécessaire.

13
hajamie

Y a-t-il une meilleure façon?

Oui il y a.

Utilisez l'utilitaire comm:

utilisation: comm [-123i] file1 file2

6
Ivan Balashov

Si cela ne fonctionne pas pour votre Shell, faites-le simplement en 3 lignes:

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

Simple mais devrait fonctionner ...

3

Le problème avec votre 'diff' posté est que diff ne peut recevoir que n fichier via stdin. Je pense donc que vous devrez écrire au moins un fichier trié dans un fichier temporaire.

diff - file.txt

diffère stdin par rapport à un fichier.txt. Le "-" représente stdin

EDIT: J'avais supposé que la substitution de processus fonctionnerait via stdin. Mais ce n'est pas le cas et ce qui précède passe par /dev/fd/{num} comme indiqué par VardhanDotNet ci-dessus.

1
Brian Agnew