2010-11-02 9 views

risposta

33

Si può provare

grep -f file1 file2 

o

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

Questo non funzionerà. Prova ad aggiungere 'dsfblah' a file2. – dogbane

+5

Puoi correggerlo con 'grep -F -x' – tripleee

+2

Penso che il tuo suggerimento valesse la pena di modificare la risposta @ tripleo – jopasserat

7

se li aspettate in un certo ordine, si può semplicemente utilizzare diff

diff file1 file2 | grep ">"

112
grep -Fxvf file1 file2 

Cosa significano le bandierine :

-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'opzione '-n' può essere aggiunta per numerare le diverse linee – boczniak767

+0

Un modo per evidenziare la parte non corrispondente di ogni linea? – PeterVermont

+0

Con questo è possibile trovare solo la prima differenza e stampare anche il suo numero di riga: 'grep -m 1 -Fnxvf file1 file2' –

31

È possibile utilizzare il comando comm per confrontare due file ordinati

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

FYI, è in realtà 'comm -1 -3 file1 file2'. I due flag '1' e' 3' sono uniti in uno solo. – cevaris

+0

comm -23 <(ordinamento file1) <(ordinamento file2) restituirà solo quelli in file1 e non in file2 - la parte migliore di ciò è qualsiasi disposizione in file2 funziona dove diff fallirà; say file1 ha 1,2,3,4,5 e file2 ha 1,2,4,5 ottieni 3 diff lo sbaglierà – user1213320

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

Se si desidera utilizzare i loop Si può provare in questo modo: (diff e CMP sono molto più efficienti.)

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 

Nota: il programma è solo quello di fornire una visione di base in ciò che può essere fatto se u non vogliono usare le chiamate di sistema come diff n comm ..

1

una risposta awk:

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

11

ho usato con successo

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

Emissione del differenza in un file.

+0

Quale modo migliore per trovare le differenze rispetto all'utilizzo di uno strumento diff haha. C'è un maggiore overhead con l'utilizzo di questo contro 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

Un provato una leggera variante risposta Luca s' e ha funzionato per me.

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

Si noti che il pattern cercato in sed è un > seguito da uno spazio.

0

Con GNU sed:

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

Come funziona:

La prima sed produce un output simile a questo:

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

Poi viene utilizzato come script sed da il secondo sed.

Problemi correlati