J'ai une série de fichiers texte pour lesquels j'aimerais connaître les lignes en commun plutôt que les lignes qui sont différentes entre elles. La ligne de commande unix ou windows est très bien.
toto:
linux-vdso.so.1 => (0x00007fffccffe000)
libvlc.so.2 => /usr/lib/libvlc.so.2 (0x00007f0dc4b0b000)
libvlccore.so.0 => /usr/lib/libvlccore.so.0 (0x00007f0dc483f000)
libc.so.6 => /lib/libc.so.6 (0x00007f0dc44cd000)
bar:
libkdeui.so.5 => /usr/lib/libkdeui.so.5 (0x00007f716ae22000)
libkio.so.5 => /usr/lib/libkio.so.5 (0x00007f716a96d000)
linux-vdso.so.1 => (0x00007fffccffe000)
Donc, étant donné ces deux fichiers ci-dessus, la sortie de l'utilitaire souhaité serait similaire à file1:line_number, file2:line_number == matching text
(juste une suggestion, je ne me soucie vraiment pas de la syntaxe):
foo:1, bar:3 == linux-vdso.so.1 => (0x00007fffccffe000)
Merci.
command-line
diff
matt wilkie
la source
la source
Réponses:
Sur * nix, vous pouvez utiliser comm . La réponse à la question est:
Voici l'utilisation complète de
comm
:Notez également qu'il est important de trier les fichiers avant d'utiliser comm, comme mentionné dans les pages de manuel.
la source
J'ai trouvé cette réponse sur une question répertoriée comme un doublon . Je trouve que grep est plus convivial que comm, donc si vous voulez juste l'ensemble des lignes correspondantes (utile pour comparer les CSV, par exemple) utilisez simplement
ou la version simplifiée de fgrep
De plus, vous pouvez utiliser
file2*
pour effectuer une recherche globale et rechercher des lignes en commun avec plusieurs fichiers, plutôt que deux.Certaines autres variantes pratiques incluent
-n
drapeau pour afficher le numéro de ligne de chaque ligne correspondante-c
pour ne compter que le nombre de lignes qui correspondent-v
pour afficher uniquement les lignes du fichier2 qui diffèrent (ou utiliserdiff
).L'utilisation
comm
est plus rapide, mais cette vitesse se fait au détriment de la nécessité de trier d'abord vos fichiers. Ce n'est pas très utile comme «diff inversé».la source
-v
drapeau après l'avoir glissé moi-même. Supposons que vous ayez deux fichiers csv file1 et file2 et qu'ils aient à la fois des lignes qui se chevauchent et qui ne se chevauchent pas. Si vous voulez toutes et uniquement les lignesfgrep -v file1 file2
qui ne se chevauchent pas, l'utilisation ne renverra que les lignes qui ne se chevauchent pas dans fichier2, et aucune des lignes non chevauchantes supplémentaires dans fichier1 . Cela peut être évident pour certains, mais il vaut mieux énoncer l'évidence que le risque d'une mauvaise interprétation. Dans ce cas particulier, trier les fichiers et utilisercomm
reste le meilleur choix.grep
: toute ligne vide du premier fichier correspondra à toutes les lignes du second fichier. Assurez-vous qu'ilfile1
n'y a pas de lignes vides, sinon il semblera que les fichiers sont identiques.grep -Fxf
C'est pour moi.A été demandé ici avant: Commande Unix pour trouver des lignes communes dans deux fichiers
Vous pouvez également essayer avec perl (crédit va ici )
la source
comm
n'était pas facilement disponible. C'était l'alternative parfaite.Je viens d'apprendre la commande comm de ce thread, mais je voulais ajouter quelque chose de plus: si les fichiers ne sont pas triés et que vous ne voulez pas toucher les fichiers d'origine, vous pouvez diriger la sortie de la commande de tri. Cela laisse les fichiers originaux intacts. Fonctionne en bash, je ne peux pas dire sur les autres coquilles.
Cela peut être étendu pour comparer la sortie de commande, au lieu de fichiers:
la source
Le moyen le plus simple est de:
Les fichiers ne doivent pas être triés.
la source
Juste pour information, j'ai créé un petit outil pour Windows faisant la même chose que "grep -F -x -f fichier1 fichier2" (car je n'ai rien trouvé d'équivalent à cette commande sous Windows)
La voici: http://www.nerdzcore.com/?page=commonlines
L'utilisation est "CommonLines inputFile1 inputFile2 outputFile"
Le code source est également disponible (GPL)
la source
Dans Windows, vous pouvez utiliser un script Powershell avec CompareObject
CompareObject:
la source