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
Du kannst es versuchen
grep -f file1 file2
oder
grep -v -F -x -f file1 file2
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.
Sie können den Befehl comm
verwenden, um zwei sortierte Dateien zu vergleichen
comm -13 <(sort file1) <(sort file2)
Ich habe erfolgreich verwendet
diff "${file1}" "${file2}" | grep "<" | sed 's/^<//g' > "${diff_file}"
Den Unterschied in eine Datei ausgeben.
wenn Sie sie in einer bestimmten Reihenfolge erwarten, können Sie einfach diff
verwenden.
diff file1 file2 | grep ">"
join -v 2 <(sort file1) <(sort file2)
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.
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
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.
eine Antwort von awk:
awk 'NR == FNR {file1[$0]++; next} !($0 in file1)' file1 file2
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.