2010-11-02 17 views

Respuesta

33

Usted puede intentar

grep -f file1 file2 

o

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

Esto no funcionará. Intenta agregar 'dsfblah' al archivo2. – dogbane

+5

se puede arreglar con 'grep -F -x' – tripleee

+2

Creo que su sugerencia era digno de editar la respuesta @tripleee – jopasserat

7

si se les está esperando en un cierto orden, sólo se puede utilizar diff

diff file1 file2 | grep ">"

112
grep -Fxvf file1 file2 

lo que significan las banderas :

-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

La opción '-n' podría agregarse para numerar las diferentes líneas – boczniak767

+0

¿Hay alguna forma de resaltar la parte no coincidente de cada línea? – PeterVermont

+0

Con esto se puede encontrar la primera diferencia única e imprimir su número de línea también: 'grep -m 1 -Fnxvf fichero1 file2' –

31

Puede utilizar el comando comm para comparar dos archivos ordenados

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

FYI, en realidad es 'comm -1 -3 file1 file2'. Las dos banderas '1' y' 3' se fusionan en una sola. – cevaris

+0

comm -23 <(ordenar archivo1) <(ordenar archivo2) generará solo aquellos en archivo1 y no en archivo2 - la mejor parte de esto es cualquier arreglo en trabajos de archivo2 donde fallará diff; dice que el archivo 1 tiene 1,2,3,4,5 y el archivo 2 tiene 1,2,4,5. Obtienes 3 diferencias. Lo obtendrás mal – user1213320

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

Si desea utilizar bucles Usted puede tratar de esta manera: (esta y CMP son mucho más eficientes.)

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: El programa es sólo para proporcionar una comprensión básica en lo que se puede hacer si u no quieren utilizar el sistema llama como diff n com ..

1

una respuesta awk:

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

11

he usado con éxito

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

Transmitir el registro diferencia a un archivo.

+0

¿Qué mejor manera de encontrar diferencias que usar una herramienta diff jaja? ¿Hay una sobrecarga más alta con el uso de 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 intentaron una ligera variación en la respuesta Luca 's y funcionó para mí.

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

Tenga en cuenta que el patrón buscado en la sed es un > seguido de un espacio.

0

Con GNU sed:

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

como funciona:

La primera sed produce una salida como esta:

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

A continuación, se utiliza como un guión sed por el segundo sed.

Cuestiones relacionadas