Wie kann ich diff so einstellen, dass nur hinzugefügte und gelöschte Zeilen angezeigt werden? Wenn diff es nicht kann, welches Tool kann es?
diff A B | grep '^[<>]'
comm
.
Wie kann ich diff so einstellen, dass nur hinzugefügte und gelöschte Zeilen angezeigt werden? Wenn diff es nicht kann, welches Tool kann es?
diff A B | grep '^[<>]'
comm
.
Antworten:
Eine andere Sichtweise:
Zeilen anzeigen, die nur in Datei a existieren: (dh was aus a gelöscht wurde)
comm -23 a b
Zeige Zeilen, die nur in Datei b existieren: (dh was wurde zu b hinzugefügt)
comm -13 a b
Zeige Zeilen, die nur in der einen oder der anderen Datei existieren: (aber nicht in beiden)
comm -3 a b | sed 's/^\t//'
(Warnung: Wenn eine Datei a
Zeilen enthält, die mit TAB beginnen, wird sie (die erste TAB) aus der Ausgabe entfernt.)
HINWEIS: Beide Dateien müssen sortiert sein, damit comm
sie ordnungsgemäß funktionieren. Wenn sie noch nicht sortiert sind, sollten Sie sie sortieren:
sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted
Wenn die Dateien extrem lang sind, kann dies eine ziemliche Belastung sein, da eine zusätzliche Kopie und damit doppelt so viel Speicherplatz erforderlich ist.
comm -12 <(sort a) <(sort b)
comm
könnte machen was du willst. Von seiner Manpage:
BESCHREIBUNG
Vergleichen Sie die sortierten Dateien FILE1 und FILE2 zeilenweise.
Ohne Optionen können Sie dreispaltige Ausgaben erstellen. Spalte eins enthält Zeilen, die für DATEI1 eindeutig sind, Spalte zwei enthält Zeilen, die für DATEI2 eindeutig sind, und Spalte drei enthält Zeilen, die für beide Dateien gleich sind.
Diese Spalten sind unterdrückbar mit -1
, -2
und -3
jeweils.
Beispiel:
[root@dev ~]# cat a
common
shared
unique
[root@dev ~]# cat b
common
individual
shared
[root@dev ~]# comm -3 a b
individual
unique
Und wenn Sie nur die eindeutigen Zeilen möchten und es Ihnen egal ist, in welcher Datei sie sich befinden:
[root@dev ~]# comm -3 a b | sed 's/^\t//'
individual
unique
Wie in der Manpage steht, müssen die Dateien vorher sortiert werden.
Anzeigen von Hinzufügungen und Löschungen ohne Kontext, Zeilennummern, +, -, <,>! usw. können Sie diff wie folgt verwenden:
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
Zum Beispiel zwei Dateien gegeben:
a.txt
Common
Common
A-ONLY
Common
b.txt
Common
B-ONLY
Common
Common
Der folgende Befehl zeigt Zeilen an, die entweder aus a entfernt oder zu b hinzugefügt wurden:
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
Ausgabe:
B-ONLY
A-ONLY
Dieser etwas andere Befehl zeigt Zeilen an, die aus a.txt entfernt wurden:
diff --changed-group-format='%<' --unchanged-group-format='' a.txt b.txt
Ausgabe:
A-ONLY
Schließlich zeigt dieser Befehl Zeilen an, die zu a.txt hinzugefügt wurden
diff --changed-group-format='%>' --unchanged-group-format='' a.txt b.txt
Ausgabe
B-ONLY
Das ist, was diff standardmäßig tut ... Vielleicht müssen Sie einige Flags hinzufügen, um Whitespace zu ignorieren?
diff -b -B
sollten Leerzeilen und unterschiedlich viele Leerzeichen ignorieren.
Nein, diff
zeigt die Unterschiede zwischen zwei Dateien nicht so, wie man denkt. Es erzeugt eine Folge von Bearbeitungsbefehlen für ein Werkzeug patch
, mit dem Sie eine Datei in eine andere ändern möchten.
Die Schwierigkeit für jeden Versuch, das zu tun, wonach Sie suchen, besteht darin, zu definieren, was eine geänderte Zeile gegenüber einer gelöschten Zeile und einer hinzugefügten Zeile darstellt. Außerdem, was zu tun ist, wenn Zeilen nebeneinander hinzugefügt, gelöscht und geändert werden.
diff
Quellen angesehen habe, aber ich scheine mich an alle möglichen Drehungen zu erinnern, um zu verfolgen, wo zwei Dateien übereinstimmen, um synchron zu bleiben, und ich denke, es gibt eine Schwelle zum Aufgeben, die davon abhängt, wie weit die voneinander entfernt sind Linien sind. Aber ich erinnere mich an keinen Zeilenabgleich, außer an (optional) reduzierte Leerzeichen oder ignorierte Groß- und Kleinschreibung. Oder (vielleicht) Worte zu diesem Thema. Auf jeden Fall geht es darum, patch
und "vgrep" kommt nur für die Fahrt mit. Vielleicht. Am Dienstag.
Visuelle Vergleichstools passen zwei Dateien zusammen, sodass ein Segment mit der gleichen Anzahl von Zeilen, aber unterschiedlichem Inhalt als geändertes Segment betrachtet wird. Völlig neue Zeilen zwischen übereinstimmenden Segmenten werden als hinzugefügte Segmente betrachtet.
So funktioniert auch das Befehlszeilentool sdiff , mit dem zwei Dateien in einem Terminal nebeneinander verglichen werden. Geänderte Zeilen werden durch | getrennt Charakter. Wenn eine Zeile nur in Datei A vorhanden ist, wird <als Trennzeichen verwendet. Wenn eine Zeile nur in Datei B vorhanden ist, wird> als Trennzeichen verwendet. Wenn die Dateien keine <und> Zeichen enthalten, können Sie dies verwenden, um nur hinzugefügte Zeilen anzuzeigen:
sdiff A B | grep '[<>]'
Danke Senarvi, deine Lösung (nicht gewählt) hat mir GENAU das gegeben, was ich wollte, nachdem ich jahrelang auf einer Tonne Seiten gesucht hatte.
Nach Ihrer Antwort habe ich mir Folgendes ausgedacht, um die Liste der Dinge zu ändern / hinzuzufügen / zu löschen. Das Beispiel verwendet zwei Versionen der Datei / etc / passwd und druckt den Benutzernamen für die relevanten Datensätze aus.
#!/bin/bash
sdiff passwd1 passwd2 | grep '[|]' | awk -F: '{print "changed: " $1}'
sdiff passwd1 passwd2 | grep '[<]' | awk -F: '{print "deleted: " $1}'
sdiff passwd1 passwd2 | grep '[>]' | awk -F\> '{print $2}' | awk -F: '{print "added: " $1}'
Ich finde diese spezielle Form oft nützlich:
diff --changed-group-format='-%<+%>' --unchanged-group-format='' f g
Beispiel:
printf 'a\nb\nc\nd\ne\nf\ng\n' > f
printf 'a\nB\nC\nd\nE\nF\ng\n' > g
diff --old-line-format=$'-%l\n' \
--new-line-format=$'+%l\n' \
--unchanged-line-format='' \
f g
Ausgabe:
-b
-c
+B
+C
-e
-f
+E
+F
Es werden also alte Zeilen mit -
gefolgt von der entsprechenden neuen Zeile mit angezeigt +
.
Wenn wir eine Löschung von C
:
printf 'a\nb\nd\ne\nf\ng\n' > f
printf 'a\nB\nC\nd\nE\nF\ng\n' > g
diff --old-line-format=$'-%l\n' \
--new-line-format=$'+%l\n' \
--unchanged-line-format='' \
f g
es sieht aus wie das:
-b
+B
+C
-e
-f
+E
+F
Das Format ist dokumentiert unter man diff
:
--line-format=LFMT
format all input lines with LFMT`
und:
LTYPE is 'old', 'new', or 'unchanged'.
GTYPE is LTYPE or 'changed'.
und:
LFMT (only) may contain:
%L contents of line
%l contents of line, excluding any trailing newline
[...]
Zugehörige Frage: https://stackoverflow.com/questions/15384818/wie-den- Unterschied- nur- zwischen-zwei- Dateien-in-linux- additionieren
Getestet in Ubuntu 18.04.
Datei1:
text670_1
text067_1
text067_2
Datei2:
text04_1
text04_2
text05_1
text05_2
text067_1
text067_2
text1000_1
Verwenden:
diff -y file1 file2
Hier werden zwei Spalten für Repectives-Dateien angezeigt.
Ausgabe:
text670_1
> text04_1
> text04_2
> text05_1
> text05_2
text067_1 text67_1
text067_2 text67_2
> text1000_1