Comparaison de deux fichiers dans le terminal linux

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

J'ai besoin d'un algorithme efficace que j'ai besoin de comparer deux dictionnaires.

132
demandé sur ROMANIA_engineer 2013-01-24 15:54:31

9 réponses

Si vim est installé, essayez ceci:

vimdiff file1 file2

Ou

vim -d file1 file2

Vous le trouverez fantastique.entrez la description de l'image ici

280
répondu larry 2015-08-25 17:57:57

Les trier et utiliser 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: lignes uniques à a, lignes uniques à b et 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 ne répertorie que 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.

54
répondu Anders Johansson 2013-01-24 11:56:23

Vous pouvez utiliser diff outil linux pour comparer deux fichiers. Vous pouvez utiliser --changé-groupe-format et --inchangé-groupe-format options pour filtrer les données requises.

Les Trois options suivantes peuvent être utilisées pour sélectionner le groupe correspondant à chaque option:

  • '%

  • '%>' obtenir des lignes de FICHIER2

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

Par exemple: diff --changé-groupe-format="%

  [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
23
répondu Manjula 2013-01-24 12:26:26

Essayer sdiff (man sdiff)

sdiff -s file1 file2
21
répondu mudrii 2014-12-27 12:53:16

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 qui ne se trouvent pas dans un dépôt git:

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

En utilisant quelques fichiers avec environ 200k chaînes de noms de fichier dans chacun, j'ai comparé (avec la commande timeintégrée) cette approche par rapport à certaines des 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 le plus rapide de loin, tandis que git diff --no-index semble être l'approche la plus rapide pour la sortie de style diff.


Mise à Jour 2018-03-25, Vous pouvez en fait, omettez l'indicateur --no-index sauf si vous êtes dans un référentiel git et que vous souhaitez comparer les fichiers non suivis dans ce référentiel. 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 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.

15
répondu joelostblom 2018-03-25 13:22:32

Vous pouvez aussi utiliser: colordiff: Affiche la sortie de diff avec des couleurs.

A 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
répondu FindlinuxOne 2016-05-16 08:18:07

Utilisation 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
répondu Chris Seymour 2013-01-24 11:58:05

Aussi, ne pas oublier mcdiff - Interne visualisateur de GNU Midnight commander.

Par exemple:

mcdiff file1 file2

Profitez!

3
répondu Iurii Golskyi 2018-06-06 12:34:15

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
1
répondu Ali Imran 2013-01-24 13:28:24