149 votes

Comparer deux fichiers ligne par ligne et générer la différence dans un autre fichier

Je veux comparer le fichier 1 avec le fichier 2 et générer un fichier 3 qui contient les lignes du fichier 1 qui ne sont pas présentes dans le fichier 2.

265voto

Sorpigal Points 10412

Diff(1) n'est pas la réponse, mais comm(1) l'est.

NAME
       comm - compare two sorted files line by line

SYNOPSIS
       comm [OPTION]... FILE1 FILE2

...

       -1     suppress lines unique to FILE1

       -2     suppress lines unique to FILE2

       -3     suppress lines that appear in both files

Alors

comm -2 -3 file1 file2 > file3

Les fichiers d'entrée doivent être triés. S'ils ne le sont pas, triez-les d'abord. Ceci peut être fait avec un fichier temporaire, ou...

comm -2 -3 <(sort file1) <(sort file2) > file3

à condition que votre shell supporte la substitution de processus (bash le fait).

50voto

Thanatos Points 13444

L'utilitaire Unix diff est conçu exactement dans ce but.

$ diff -u file1 file2 > file3

Consultez le manuel et l'Internet pour connaître les options, les différents formats de sortie, etc.

25voto

Neilvert Noval Points 796

Considérez ceci :
fichier a.txt :

abcd
efgh

fichier b.txt :

abcd

Vous pouvez trouver la différence avec :

diff -a --suppress-common-lines -y a.txt b.txt

La sortie sera :

efgh 

Vous pouvez rediriger la sortie dans un fichier de sortie (c.txt) en utilisant :

diff -a --suppress-common-lines -y a.txt b.txt > c.txt

Cela répondra à votre question :

"...qui contient les lignes du fichier 1 qui sont ne sont pas présentes dans le fichier 2".

17voto

αғsнιη Points 1205

Pourtant, aucun grep solution ?

  • lignes qui n'existent que dans le fichier 2 :

    grep -Fxvf file1 file2 > file3
  • les lignes qui n'existent que dans le fichier 1 :

    grep -Fxvf file2 file1 > file3
  • qui existent dans les deux fichiers :

    grep -Fxf file1 file2 > file3

13voto

Dennis Williamson Points 105818

Parfois diff est l'utilitaire dont vous avez besoin, mais parfois join est plus approprié. Les fichiers doivent être pré-triés ou, si vous utilisez un shell qui supporte la substitution de processus comme bash, ksh ou zsh, vous pouvez faire le tri à la volée.

join -v 1 <(sort file1) <(sort file2)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X