web-dev-qa-db-fra.com

Comparer deux fichiers dans un terminal linux

Il y a deux fichiers appelés "a.txt" et "b.txt" ont tous les deux une liste de mots. Maintenant, je veux vérifier quels mots sont extra dans "a.txt" et ne sont pas dans "b.txt".

J'ai besoin d'un algorithme efficace car je dois comparer deux dictionnaires.

151
Ali Imran

Voici ma solution pour cela:

mkdir temp
mkdir results
cp /usr/share/dict/american-english ~/temp/american-english-dictionary
cp /usr/share/dict/british-english ~/temp/british-english-dictionary
cat ~/temp/american-english-dictionary | wc -l > ~/results/count-american-english-dictionary
cat ~/temp/british-english-dictionary | wc -l > ~/results/count-british-english-dictionary
grep -Fxf ~/temp/american-english-dictionary ~/temp/british-english-dictionary > ~/results/common-english
grep -Fxvf ~/results/common-english ~/temp/american-english-dictionary > ~/results/unique-american-english
grep -Fxvf ~/results/common-english ~/temp/british-english-dictionary > ~/results/unique-british-english
0
Ali Imran

si vous avez installé vim, essayez ceci:

vimdiff file1 file2

ou

vim -d file1 file2

vous le trouverez fantastique.enter image description here

321
Fengya Li

Triez-les et utilisez comm:

comm -23 <(sort a.txt) <(sort b.txt)

comm compare les fichiers d'entrée (triés) et génère par défaut trois colonnes: les lignes uniques à a, les lignes uniques à b et les lignes présentes dans les deux. En spécifiant -1, -2 et/ou -3, vous pouvez supprimer la sortie correspondante. Par conséquent, comm -23 a b répertorie uniquement les entrées uniques à a. J'utilise la syntaxe <(...) pour trier les fichiers à la volée. S'ils sont déjà triés, vous n'en avez pas besoin.

62
Anders Johansson

Essayez sdiff (man sdiff)

sdiff -s file1 file2
28
mudrii

Vous pouvez utiliser l'outil diff sous Linux pour comparer deux fichiers. Vous pouvez utiliser les options - modified-group-format et - unchanged-group-format pour filtrer les données requises.

Les trois options suivantes peuvent être utilisées pour sélectionner le groupe approprié pour chaque option:

  • '% <' récupère les lignes de FILE1

  • '%>' récupère les lignes de FILE2

  • '' (chaîne vide) pour supprimer les lignes des deux fichiers.

E.g: diff --changed-group-format = "% <" --unchanged-group-format = "" fichier1.txt fichier2.txt

[root@vmoracle11 tmp]# cat file1.txt 
test one
test two
test three
test four
test eight
[root@vmoracle11 tmp]# cat file2.txt 
test one
test three
test nine
[root@vmoracle11 tmp]# diff --changed-group-format='%<' --unchanged-group-format='' file1.txt file2.txt 
test two
test four
test eight
26
Manjula

Si vous préférez le style de sortie diff de git diff, vous pouvez l'utiliser avec l'indicateur --no-index pour comparer des fichiers ne se trouvant pas dans un référentiel git:

git diff --no-index a.txt b.txt

À l'aide de quelques fichiers contenant chacun environ 200 000 chaînes de noms de fichiers, j'ai analysé (avec la commande intégrée time _) cette approche par rapport à d'autres réponses ici:

git diff --no-index a.txt b.txt
# ~1.2s

comm -23 <(sort a.txt) <(sort b.txt)
# ~0.2s

diff a.txt b.txt
# ~2.6s

sdiff a.txt b.txt
# ~2.7s

vimdiff a.txt b.txt
# ~3.2s

comm semble être de loin le plus rapide, tandis que git diff --no-index semble être l'approche la plus rapide pour une sortie de type diff.


Mise à jour 2018-03-25 Vous pouvez réellement omettre l'indicateur --no-index sauf si vous vous trouvez dans un référentiel git et souhaitez comparer les fichiers non suivis à l'intérieur de celui-ci. dépôt. De les pages de manuel :

Ce formulaire permet de comparer les deux chemins donnés sur le système de fichiers. Vous pouvez omettre l'option --no-index lorsque vous exécutez la commande dans un arbre de travail contrôlé par Git et qu'au moins l'un des chemins pointe en dehors de l'arbre de travail, ou lorsque vous exécutez la commande en dehors d'un arbre de travail contrôlé par Git.

21
joelostblom

Vous pouvez également utiliser: colordiff : Affiche le résultat de diff avec des couleurs.

À propos de vimdiff : Il vous permet de comparer des fichiers via SSH, par exemple:

vimdiff /var/log/secure scp://192.168.1.25/var/log/secure

Extrait de: http://www.sysadmit.com/2016/05/linux-diferencias-entre-dos-archivos.html

9
FindlinuxOne

De plus, n'oubliez pas mcdiff - Afficheur de diff interne de GNU Midnight Commander .

Par exemple:

mcdiff file1 file2

Prendre plaisir!

6
Iurii Golskyi

Utilisez comm -13(nécessite des fichiers triés):

$ cat file1
one
two
three

$ cat file2
one
two
three
four

$ comm -13 <(sort file1) <(sort file2)
four
4
Chris Seymour