Lấy đúng số dòng trong đầu ra khác


8

Tôi muốn có được số dòng chính xác trong đầu ra của diff (cụ thể là với -y--suppress-common-linestùy chọn). Sử dụng đơn giản wc -lkhông không làm việc, bởi vì nếu cả hai tập tin kết thúc mà không một dòng mới và dòng cuối cùng của họ là khác nhau wc -lsẽ không được tính dòng cuối cùng.

Có một giải pháp đơn giản và hiệu quả để tránh điều này?

Ví dụ: nếu bạn có tệp "a":

a
b
c
d   #no newline here

Và B":

a
b
c
D    #no newline here

Đầu ra là:

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

Điều này rõ ràng là không chính xác vì diff không xuất ra một dòng.

Câu trả lời:


13

Không có dòng mới, như vậy wc -llà chính xác. Thay vào đó, bạn muốn đếm số lượng bắt đầu của dòng. Một cách để làm điều đó:

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

3

Nó không sai. Một dòng phải được chấm dứt bởi một ký tự LF, nếu không, nó không phải là một dòng (và dù sao cũng wc -lđược ghi lại để đếm các ký tự dòng mới, không phải các dòng).

Bạn có thể chuyển đầu ra thành một cái gì đó bổ sung lại ký tự LF bị thiếu. GNU dán thực hiện nó:

$ 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

Nó có thể không hoạt động với các triển khai dán khác, nhưng vì bạn đang sử dụng các tùy chọn cụ thể của GNU diff, nên chúng tôi có thể giả định rằng bạn cũng có GNU paste. Hành vi của các tiện ích văn bản cho các dòng không kết thúc là không xác định bởi POSIX.


0

Như đã nêu trong trang người đàn ông và thông tin, có vẻ như tùy chọn -l( --lines) để wcin số lượng ký tự dòng mới. Vì vậy, nếu một dòng không kết thúc bằng một ký tự dòng mới, nó sẽ không tăng số lượng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.