2010-11-02 23 views

Répondre

33

Vous pouvez

grep -f file1 file2 

ou

grep -v -F -x -f file1 file2 
+4

Cela ne fonctionnera pas. Essayez d'ajouter 'dsfblah' à file2. – dogbane

+5

Vous pouvez le réparer avec 'grep -F -x' – tripleee

+2

Je pense que votre suggestion valait la peine d'éditer la réponse @tripleee – jopasserat

7

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

diff file1 file2 | grep ">"

112
grep -Fxvf file1 file2 

Ce que les drapeaux signifient :

-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. 
+2

L'option '-n' pourrait être ajoutée pour numéroter les différentes lignes – boczniak767

+0

Une façon de mettre en évidence la partie non-correspondante de chaque ligne? – PeterVermont

+0

Avec cela, vous pouvez trouver la première différence seulement et imprimer son numéro de ligne aussi: 'grep -m 1 -Fnxvf fichier1 fichier2' –

31

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

comm -13 <(sort file1) <(sort file2) 
+2

FYI, c'est en fait 'comm -1 -3 fichier1 fichier2'. Les deux drapeaux «1» et «3» sont fusionnés en un. – cevaris

+0

comm -23 <(trier fichier1) <(trier fichier2) ne produira que ceux dans fichier1 et pas dans fichier2 - la meilleure partie de tout arrangement dans fichier2 fonctionne où diff va échouer; disons que fichier1 a 1,2,3,4,5 et que fichier2 a 1,2,4,5 vous obtenez 3 diff va se tromper – user1213320

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

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 

Note: Le programme est seulement de fournir un aperçu de base de ce qui peut se faire que si u ne veux pas utiliser le système appels tels que diff n comm ..

1

une réponse awk:

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

11

J'ai utilisé avec succès

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

Sortie du différence à un fichier.

+0

Quelle meilleure façon de trouver des différences que d'utiliser un outil de diff haha. Y a-t-il des frais généraux plus élevés avec l'utilisation de ce par rapport à grep? – Sirens

2
 
file1 
m1 
m2 
m3 

file2 
m2 
m4 
m5 

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

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

> What's awk command to get 'm1 and m3' ?? as in file1 and not in file2? 
m1 
m3 
3

A essayé une légère variation de 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.

0

Avec GNU sed:

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

Comment ça marche:

Le premier sed produit une sortie comme ceci:

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

Ensuite, il est utilisé comme un script sed par le deuxième sed.