Ottieni il numero corretto di righe nell'output diff


8

Voglio ottenere il numero corretto di righe nell'output di diff (in particolare con -ye le --suppress-common-linesopzioni). Utilizzando un semplice wc -lfa non il lavoro, perché se entrambi i file finiscono senza un ritorno a capo e la loro ultima linea è diversa wc -lnon conta l'ultima riga.

Esiste una soluzione semplice ed efficace per evitarlo?

Ad esempio, se hai file "a":

a
b
c
d   #no newline here

E B":

a
b
c
D    #no newline here

L'output è:

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

Il che è evidentemente sbagliato dal momento che diff fa l'uscita di una linea.

Risposte:


13

Non c'è newline, quindi wc -lè corretto. Invece, vuoi contare il numero di inizio delle righe. Un modo per farlo:

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

3

Non è errato Una riga deve essere terminata da un carattere LF, altrimenti non è una riga (e comunque wc -lè documentata per contare i caratteri di nuova riga, non le righe).

È possibile reindirizzare l'output in qualcosa che aggiunge il carattere LF mancante. GNU paste lo fa:

$ 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

Potrebbe non funzionare con altre implementazioni di paste, ma dal momento che stai usando le opzioni specifiche di GNU diff, possiamo probabilmente supporre che tu abbia anche GNU paste. POSIX non ha specificato il comportamento delle utility di testo per le righe non terminate.


0

Come indicato nelle pagine man e info, sembra l' opzione -l( --lines) per wcstampare il numero di caratteri di nuova riga. Quindi, se una riga non termina con un carattere di nuova riga, non incrementa il conteggio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.