web-dev-qa-db-fra.com

trouver la différence entre deux fichiers texte avec un élément par ligne

J'ai deux fichiers:

fichier 1

dsf
sdfsd
dsfsdf

fichier 2

ljljlj 
lkklk 
dsf
sdfsd
dsfsdf

Je veux afficher ce qui est dans le fichier 2 mais pas dans le fichier 1, donc le fichier 3 devrait ressembler

ljljlj 
lkklk 
68
vehomzzz

Tu peux essayer

grep -f file1 file2

ou

grep -v -F -x -f file1 file2
45
krico
grep -Fxvf file1 file2

Que signifient les drapeaux:

-F, --fixed-strings
              Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.    
-x, --line-regexp
              Select only those matches that exactly match the whole line.
-v, --invert-match
              Invert the sense of matching, to select non-matching lines.
-f FILE, --file=FILE
              Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.
128
dogbane

Vous pouvez utiliser la commande comm pour comparer deux fichiers triés.

comm -13 <(sort file1) <(sort file2)
37
dogbane

J'ai utilisé avec succès

diff "${file1}" "${file2}" | grep "<" | sed 's/^<//g' > "${diff_file}"

Sortie de la différence dans un fichier.

12
Luca Borrione

si vous les attendez dans un certain ordre, vous pouvez simplement utiliser diff

diff file1 file2 | grep ">"

7
Nate
join -v 2 <(sort file1) <(sort file2)
6

A essayé une légère variation sur la réponse de Luca et cela a fonctionné pour moi.

diff file1 file2 | grep ">" | sed 's/^> //g' > diff_file

Notez que le motif recherché dans sed est un > suivi d'un espace. 

3
Riccardo Cicuttini
 file1 
 m1 
 m2 
 m3 

 file2 
 m2 
 m4 
 m5 

> awk 'NR == FNR {file1 [$ 0] ++; next}! ($ 0 dans fichier1) 'fichier1 fichier2 
 m4 
 m5 

> awk' NR == FNR {fichier1 [$ 0] ++; next} ($ 0 dans fichier1) 'fichier1 fichier2 
 m2 

> Quelle est la commande awk pour obtenir' m1 et m3 '?? comme dans file1 et pas dans file2? 
 m1 
 m3 
2
Chals

Si vous voulez utiliser des boucles, vous pouvez essayer comme ceci: (diff et cmp sont beaucoup plus efficaces.)

while read line
do
    flag = 0
    while read line2
    do
       if ( "$line" = "$line2" )
        then
            flag = 1
        fi
     done < file1 
     if ( flag -eq 0 )
     then
         echo $line > file3
     fi
done < file2

Remarque: le programme n'a pour but que de fournir un aperçu de base de ce qui peut être fait si vous ne voulez pas utiliser d'appels système tels que diff n comm ..

1
letsc

une réponse awk:

awk 'NR == FNR {file1[$0]++; next} !($0 in file1)' file1 file2

1
glenn jackman

Avec GNU sed:

sed 's#[^^]#[&]#g;s#\^#\\^#g;s#^#/^#;s#$#$/d#' file1 | sed -f- file2

Comment ça marche:

La première sed produit une sortie comme celle-ci:

/^[d][s][f]$/d
/^[s][d][f][s][d]$/d
/^[d][s][f][s][d][f]$/d

Ensuite, il est utilisé comme script sed par la seconde sed.

0
Jahid