web-dev-qa-db-fra.com

Sortiez-vous les lignes communes (similarités) de deux fichiers texte (l'opposé de diff)?

DIFF est un excellent outil pour afficher les modifications entre deux fichiers. Mais comment afficher les similitudes de deux fichiers texte (tout en ignorant les différences)?

C'est à dire. Entrée 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 trier les deux fichiers et l'utilisation de comm n'est pas suffisant, car dans ce cas, les informations de ligne sont perdues.

23
maxschlepzig

Que diriez-vous d'utiliser DIFF, même si vous ne voulez pas de 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
24
Mike Gray
grep -Fxf file1 file2

-F signifie correspondance des chaînes simples (pas non plus), -x ne signifie que des matchs de ligne entiers, -f signifie prendre des "motifs" (i.e. lignes) du fichier nommé comme argument

15
tobyodavies

Je ne pense pas qu'il y ait une seule commande qui fait ce que vous voulez faire. Vous pouvez essayer de combiner la sortie de diff avec grep, cependant. Si vos fichiers texte ne contiennent aucun des caractères |, <, >, ce qui suit vous donne une sortie un peu utile:

$ diff --side-by-side a b | grep -n -v "[|<>]"
3:Hello                             Hello
4:World                             World
8
Marcel Stimberg

comm peut être utilisé. man comm Pour toutes les options, mais vous voudrez utiliser comm -12 ... Pour afficher uniquement des lignes existantes dans les deux intrants.

Comme les gens l'ont souligné, vous devez transmettre votre contribution à travers sort d'abord.

7
Oli

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

http://dickgrune.com/programs/similarity_tester/

Il existe des versions qui analysent la syntaxe de différentes langues, de sorte que des choses comme des variables renommées puissent être considérées comme inchangées.

Il est emballé comme similarity-tester à Debian et Ubuntu.

2
Douglas Bagnall