Erhalten Sie die richtige Anzahl von Zeilen in der Diff-Ausgabe

8

Ich möchte die richtige Anzahl von Zeilen in der Ausgabe von diff erhalten (speziell mit -yund --suppress-common-linesOptionen). Die Verwendung einer einfachen Zeile wc -lfunktioniert nicht , da beide Dateien ohne Zeilenumbruch enden und ihre letzte Zeile unterschiedlich ist, wc -lwird die letzte Zeile nicht gezählt.

Gibt es eine einfache und effiziente Lösung, um dies zu vermeiden?

Zum Beispiel, wenn Sie Dateien "a" haben:

a
b
c
d   #no newline here

Und B":

a
b
c
D    #no newline here

Die Ausgabe ist:

$ diff -y --suppress-common-lines a b | wc -l
0

Das ist offensichtlich falsch , da diff tut Ausgabe eine Linie.

Bakuriu
quelle

Antworten:

13

Es gibt keine neue Zeile, wc -list also richtig. Stattdessen möchten Sie die Anzahl der Zeilenanfänge zählen. Ein Weg, es zu tun:

$ diff -y --suppress-common-lines a b | grep '^' | wc -l
1
ire_and_curses
quelle
3

Es ist nicht falsch. Eine Zeile muss durch ein LF-Zeichen abgeschlossen werden, andernfalls handelt es sich nicht um eine Zeile (und es wird sowieso wc -ldokumentiert, dass Zeilenumbrüche und keine Zeilen gezählt werden).

Sie können die Ausgabe in etwas weiterleiten, das das fehlende LF-Zeichen wieder hinzufügt. GNU Paste macht es:

$ diff -y --suppress-common-lines <(printf a) <(printf b) | wc -l
0
$ diff -y --suppress-common-lines <(printf a) <(printf b) | paste | wc -l
1

Es funktioniert möglicherweise nicht mit anderen Implementierungen von Paste, aber da Sie GNU-spezifische Optionen verwenden, diffkönnen wir wahrscheinlich davon ausgehen, dass Sie auch GNU haben paste. Das Verhalten von Textdienstprogrammen für nicht terminierte Zeilen wird von POSIX nicht angegeben.

Stéphane Chazelas
quelle
0

Wie auf den Man- und Infoseiten angegeben, scheint es die Option -l( --lines) zu sein, um wcdie Anzahl der Zeilenumbrüche zu drucken. Wenn eine Zeile nicht mit einem Zeilenumbruchzeichen endet, wird die Anzahl nicht erhöht.

Francesco Turco
quelle