Comment comparer deux fichiers avec un script shell?


10

Étant donné deux fichiers, je veux écrire un script shell qui lit chaque ligne de file1 et vérifie si elle est là dans file2. Si une ligne n'est pas trouvée, elle devrait produire deux fichiers différents et quitter. Les fichiers peuvent contenir des mots ou n'importe quoi. Par exemple :

fichier1:

Hi!
1234
5678
1111
hello

fichier2:

1111
5678
1234
Hi!
hello

Dans ce cas, deux fichiers doivent être égaux. si file2 a "bonjour !!!" au lieu de "bonjour" alors les fichiers sont différents. J'utilise le script bash. Comment puis-je faire ceci. Ce n'est pas important que je doive le faire dans une boucle imbriquée mais c'est ce que je pensais être le seul moyen. Merci de votre aide.

Réponses:



10

diffdéfinit son état de sortie pour indiquer si les fichiers sont identiques ou non. Le statut de sortie est accessible dans la variable spéciale $?. Vous pouvez développer la réponse d'Ignacio de cette façon:

diff --brief <(sort file1) <(sort file2) >/dev/null
comp_value=$?

if [ $comp_value -eq 1 ]
then
    echo "do something because they're different"
else
    echo "do something because they're identical"
fi

3
Vous pouvez simplement vous if diff ... >/dev/nullpasser des crochets et de la variable.
pause jusqu'à nouvel ordre.

1

Ajouter cela parce que je pense que le [[]] && || la construction est assez soignée:

#!/bin/bash

[[ `diff ${HOME}/file1 ${HOME}/file2` ]] &&  
   (echo "files different") ||
   (echo "files same")

1

Devrait également fonctionner:

comm -3 file1 file2

Je pense que c'est assez de caractères pour une réponse ...


1

Bien que ce diffsoit une réponse parfaitement correcte, j'utiliserais probablement à la cmpplace ce qui est spécifiquement pour faire une comparaison octet par octet de deux fichiers.

https://linux.die.net/man/1/cmp

Pour cette raison, il a l'avantage supplémentaire de pouvoir comparer les fichiers binaires.

if cmp -s "file1" "file2"
then
   echo "The files match"
else
   echo "The files are different"
fi

Je suis amené à croire que c'est plus rapide que l'utilisation diffmême si je n'ai pas personnellement testé cela.


Le cas "les fichiers sont différents" ne serait-il pas le premier? Le test if demande si quelque chose est vrai, c'est-à-dire un code retour différent de zéro. Si les fichiers correspondent, cmp renvoie 0 (selon la page de manuel), et cela devrait donc être le deuxième cas.
user8162

@ user8162 Ce que vous dites est logique, mais je viens de le tester et c'est la bonne solution. Je ne sais pas pourquoi c'est le cas pour être honnête.
Richard
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.