Ich habe zwei nahezu identische Dateien,"foo" und "bar".
Jede Datei hat Tausende von Zeilen, jede Zeile hat eine Nummer.
Wenn ich sort
und dann diff
beide Dateien einfüge, ist das das Ergebnis:
$ diff foo bar
5984a5985,5986
> 15676
> 15677
7703,7706d7704
< 17486
< 17487
< 17488
< 17489
Wenn ich jedoch grep -Fvf
beide Dateien verwende, erhalte ich in beide Richtungen null „Nichtübereinstimmungen“:
$ grep -Fvf foo bar
$ grep -Fvf bar foo
$
Warum ist das so? Sollte ich nicht ähnliche Ergebnisse wie bei diff erhalten? Ich würde erwarten, dass der erste Befehl mir die „erste Hälfte“ der Werte von diff zurückgibt und der zweite grep-Befehl mir den Rest zurückgibt.
Warum erhalte ich nicht die erwarteten Ergebnisse?
Antwort1
Denn diff
im Gegensatz grep -Fvf
zuDie Reihenfolge, in der die Zeilen erscheinen, ist wichtig. Da die -x
Option nicht im grep-Befehl enthalten war, wurden Zeilen mit bloßenteilweise Übereinstimmungensind von der Ausgabe ausgeschlossen.
Reproduzierbares Beispiel
Betrachten Sie diese beiden Dateien:
$ cat foo
156
174
15676
17486
17487
$ cat bar
15677
15678
156
174
15676
Der diff
Befehl zeigt, dass sie unterschiedlich sind, während die grep
Befehle keine Ausgabe erzeugen:
$ diff foo bar
0a1,2
> 15677
> 15678
4,5d5
< 17486
< 17487
$ grep -Fvf foo bar; grep -Fvf bar foo
Wenn wir „full-line matches“ hinzufügen -x
, erzeugt grep Folgendes:
$ grep -Fvxf foo bar
15677
15678
$ grep -Fvxf bar foo
17486
17487
Zusätzlicher Vorschlag
Alsablichtenin den Kommentaren vorschlägt, diff -u
erzeugt mehr Kontext, der das Ergebnis verständlicher machen kann.