Dapatkan jumlah garis yang benar dalam keluaran diff

8

Saya ingin mendapatkan jumlah baris yang benar dalam output diff (khusus dengan -ydan --suppress-common-linesopsi). Menggunakan sederhana wc -ltidak tidak bekerja, karena jika kedua file berakhir tanpa baris baru dan baris terakhir mereka berbeda wc -ltidak akan menghitung baris terakhir.

Apakah ada solusi sederhana dan efisien untuk menghindari ini?

Misalnya, jika Anda memiliki file "a":

a
b
c
d   #no newline here

Dan B":

a
b
c
D    #no newline here

Outputnya adalah:

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

Yang jelas tidak benar karena diff tidak menghasilkan garis.

Bakuriu
sumber

Jawaban:

13

Tidak ada baris baru, jadi wc -litu benar. Sebagai gantinya, Anda ingin menghitung jumlah awal baris. Salah satu cara untuk melakukannya:

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

Itu tidak salah. Baris harus diakhiri oleh karakter LF, jika tidak, itu bukan baris (dan lagi pula wc -ldidokumentasikan untuk menghitung karakter baris baru, bukan baris).

Anda bisa menyalurkan output ke sesuatu yang menambah kembali karakter LF yang hilang. Pasta GNU melakukannya:

$ 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

Mungkin tidak bekerja dengan implementasi tempel lainnya, tetapi karena Anda menggunakan opsi khusus GNU diff, kami mungkin dapat dengan aman berasumsi bahwa Anda juga memiliki GNU paste. Perilaku utilitas teks untuk baris yang tidak diakhiri tidak ditentukan oleh POSIX.

Stéphane Chazelas
sumber
0

Sebagaimana dinyatakan dalam halaman manual dan info, tampaknya opsi -l( --lines) untuk wcmencetak jumlah karakter baris baru. Jadi, jika garis tidak berakhir dengan karakter baris baru, itu tidak menambah hitungan.

Francesco Turco
sumber