Produire les lignes communes (similarités) de deux files text (le contraire de diff)?

Diff est un excellent outil pour afficher les changements entre deux files. Mais comment afficher les similitudes de deux files text (tout en ignorant les différences)?

C'est-à-dire input d'échantillon:

a: Foo Bar X Hello World 42 b: Foo Baz Hello World 23 

Pseudo sortie (quelque chose comme ça):

 @@ 2,3 =Hello World 

Il suffit de sortinger les deux files et d'utiliser comm, car dans ce cas, les informations de ligne sont perdues.

Que diriez-vous d'utiliser diff, même si vous ne voulez pas un diff? Essaye ça:

 diff --unchanged-group-format='@@ %dn,%df %<' --old-group-format='' --new-group-format='' \ --changed-group-format='' a.txt b.txt 

Voici ce que je reçois avec vos données d'échantillon:

 $ cat a.txt Foo Bar X Hello World 42 $ cat b.txt Foo Baz Hello World 23 $ diff --unchanged-group-format='@@ %dn,%df %<' --old-group-format='' --new-group-format='' \ --changed-group-format='' a.txt b.txt @@ 2,3 Hello World 

Je ne pense pas qu'il y ait une seule command qui fasse ce que vous voulez faire. Vous pouvez essayer de combiner la sortie de diff avec grep , cependant. Si vos files text ne contiennent aucun des caractères | , < , > , ce qui suit vous donne un résultat assez utile:

 $ diff --side-by-side ab | grep -n -v "[|<>]" 3:Hello Hello 4:World World 
 grep -Fxf file1 file2 

-F signifie faire correspondre des strings simples (pas de regexps), -x signifie seulement des correspondances entières, -f signifie prendre des "patterns" (c'est-à-dire des lignes) à partir du file nommé comme argument

comm peut être utilisé. man comm pour toutes les options, mais vous voudrez utiliser comm -12 ... pour afficher uniquement les lignes qui existent dans les deux inputs.

Comme les gens l'ont souligné, vous devez passer votre consortingbution par le biais d'abord.

Dick Grune a écrit une famille d'outils pour ce genre de chose:

http://dickgrune.com/Programs/similarity_tester/

Il existe des versions qui parsingnt la syntaxe de plusieurs langues, de sorte que des choses comme les variables renommées peuvent être considérées comme inchangées.

Il est empackageé en tant que similarity-tester de similarity-tester dans Debian et Ubuntu.