Il existe deux fichiers appelés "a.txt" et "b.txt" qui ont tous deux une liste de mots. Maintenant, je veux vérifier quels mots sont supplémentaires dans "a.txt" et ne sont pas dans "b.txt" .
J'ai besoin d'un algorithme efficace car j'ai besoin de comparer deux dictionnaires.
linux
terminal
diff
file-comparison
Ali Imran
la source
la source
diff a.txt b.txt
n'est pas assez?Réponses:
si vous avez installé vim, essayez ceci:
ou
vous le trouverez fantastique.
la source
Triez-les et utilisez
comm
: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équentcomm -23 a b
, ne répertorie que les entrées uniques à un fichier. J'utilise la<(...)
syntaxe pour trier les fichiers à la volée, s'ils sont déjà triés, vous n'en avez pas besoin.la source
comm
est plus efficace car il effectue le travail en une seule exécution, sans stocker l'intégralité du fichier en mémoire. Puisque vous utilisez des dictionnaires qui sont probablement déjà triés, vous n'en avez même pas besoinsort
. L'utilisationgrep -f file1 file2
d'un autre côté chargera le toutfile1
en mémoire et comparera chaque lignefile2
avec toutes ces entrées, ce qui est beaucoup moins efficace. C'est surtout utile pour les petits, non triés-f file1
.\n
sera également inclus pour faire la comparaison.Essayez
sdiff
(man sdiff
)la source
Vous pouvez utiliser l'
diff
outil sous Linux pour comparer deux fichiers. Vous pouvez utiliser les options --changed-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 des lignes des deux fichiers.
la source
Si vous préférez le style de sortie diff
git diff
, vous pouvez l'utiliser avec l'--no-index
indicateur pour comparer des fichiers qui ne se trouvent pas dans un référentiel git:En utilisant quelques fichiers avec environ 200k chaînes de noms de fichiers chacun, j'ai comparé (avec la
time
commande intégrée ) cette approche par rapport à certaines des autres réponses ici:comm
semble être de loin la plus rapide, alors qu'ellegit diff --no-index
semble être l'approche la plus rapide pour la sortie de style diff.Mise à jour 25/03/2018 Vous pouvez en fait omettre l'
--no-index
indicateur sauf si vous êtes dans un référentiel git et que vous souhaitez comparer les fichiers non suivis dans ce référentiel. Depuis les pages de manuel :la source
Vous pouvez également utiliser: colordiff : affiche la sortie de diff avec des couleurs.
À propos de vimdiff : Il vous permet de comparer des fichiers via SSH, par exemple:
Extrait de: http://www.sysadmit.com/2016/05/linux-diferencias-entre-dos-archivos.html
la source
N'oubliez pas non plus mcdiff - Visualiseur de différences internes de GNU Midnight Commander .
Par exemple:
Prendre plaisir!
la source
Utilisation
comm -13
(nécessite des fichiers triés) :la source
Voici ma solution pour cela:
la source
sdiff -s file1 file2
été utile.Utiliser awk pour cela. Fichiers de test:
Le awk:
Les doublons sont générés:
Pour éviter les doublons, ajoutez chaque mot nouvellement rencontré dans a.txt au
seen
hachage:Production:
Si les listes de mots sont séparées par des virgules, comme:
vous devez faire quelques tours supplémentaires (
for
boucles):Sortie cette fois:
la source