it-swarm.com.de

finden Sie den Unterschied zwischen zwei Textdateien mit einem Element pro Zeile

Ich habe zwei Dateien:

datei 1

dsf
sdfsd
dsfsdf

datei 2

ljljlj 
lkklk 
dsf
sdfsd
dsfsdf

Ich möchte anzeigen, was in Datei 2 enthalten ist, aber nicht in Datei 1, daher sollte Datei 3 aussehen

ljljlj 
lkklk 
68
vehomzzz

Du kannst es versuchen

grep -f file1 file2

oder

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

Was bedeuten die Flaggen:

-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

Sie können den Befehl comm verwenden, um zwei sortierte Dateien zu vergleichen

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

Ich habe erfolgreich verwendet

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

Den Unterschied in eine Datei ausgeben.

12
Luca Borrione

wenn Sie sie in einer bestimmten Reihenfolge erwarten, können Sie einfach diff verwenden.

diff file1 file2 | grep ">"

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

A versuchte eine leichte Variation von Luca 's Antwort und es funktionierte für mich.

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

Beachten Sie, dass das gesuchte Muster in sed ein > ist, gefolgt von einem Leerzeichen. 

3
 file1 
 m1 
 m2 
 m3 

 file2 
 m2 
 m4 
 m5 

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

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

> Was ist der Befehl von awk, um' m1 und m3 'zu erhalten ?? wie in file1 und nicht in file2? 
 m1 
 m3 
2
Chals

Wenn Sie Schleifen verwenden möchten, können Sie Folgendes versuchen: (diff und cmp sind wesentlich effizienter.)

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

Hinweis: Das Programm soll nur einen grundlegenden Einblick geben, was getan werden kann, wenn Systemaufrufe wie diff n comm nicht verwendet werden sollen.

1
letsc

eine Antwort von awk:

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

1
glenn jackman

Mit GNU sed:

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

Wie es funktioniert:

Die erste sed erzeugt eine Ausgabe wie folgt:

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

Dann wird es von der zweiten sed als sed-Skript verwendet.

0
Jahid