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.
9 réponses
Si vim est installé, essayez ceci:
vimdiff file1 file2
Ou
vim -d file1 file2
Vous le trouverez fantastique.
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.
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
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 time
inté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.
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
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
Aussi, ne pas oublier mcdiff - Interne visualisateur de GNU Midnight commander.
Par exemple:
mcdiff file1 file2
Profitez!
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