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.

0x0
la source

Réponses:

9

En bash:

diff --brief <(sort file1) <(sort file2)
Ignacio Vazquez-Abrams
la source
Que faire si le fichier est un fichier csv. le tri fonctionnerait-il toujours?
0x0
sortne se soucie pas du contenu exact, sauf si vous le lui dites.
Ignacio Vazquez-Abrams le
Est-il possible de trouver quelles lignes diffèrent?
0x0
Supprimer --briefet ajouter des options de format, par exemple -u.
Ignacio Vazquez-Abrams
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
Doug Harris
la source
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")
mmrtnt
la source
1

Devrait également fonctionner:

comm -3 file1 file2

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

mpez0
la source
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.

Richard
la source
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