wc -l
không tính dòng.
Vâng, câu trả lời này có thể hơi muộn cho bữa tiệc, nhưng tôi chưa tìm thấy ai có tài liệu giải pháp mạnh mẽ hơn trong các câu trả lời.
Trái với niềm tin phổ biến, POSIX không yêu cầu các tệp kết thúc bằng một ký tự dòng mới. Có, định nghĩa của Dòng POSIX 3.206 như sau:
Một chuỗi gồm 0 hoặc nhiều ký tự không phải <dòng mới> cộng với một ký tự kết thúc.
Tuy nhiên, điều mà nhiều người không biết là POSIX cũng định nghĩa Đường dây không hoàn chỉnh POSIX 3.195 là:
Một chuỗi gồm một hoặc nhiều ký tự không phải <dòng mới> ở cuối tệp.
Do đó, các tệp không có dấu vết LF
là hoàn toàn tuân thủ POSIX.
Nếu bạn chọn không hỗ trợ cả hai loại EOF, chương trình của bạn không tuân thủ POSIX.
Ví dụ, chúng ta hãy xem các tập tin sau.
1 This is the first line.
2 This is the second line.
Bất kể EOF, tôi chắc chắn bạn sẽ đồng ý rằng có hai dòng. Bạn đã tìm ra điều đó bằng cách xem có bao nhiêu dòng đã được bắt đầu, chứ không phải bằng cách xem có bao nhiêu dòng đã bị chấm dứt. Nói cách khác, theo POSIX, cả hai tệp này đều có cùng số lượng dòng:
1 This is the first line.\n
2 This is the second line.\n
1 This is the first line.\n
2 This is the second line.
Trang người đàn ông tương đối rõ ràng về việc wc
đếm dòng mới, với dòng mới chỉ là một 0x0a
ký tự:
NAME
wc - print newline, word, and byte counts for each file
Do đó, wc
thậm chí không cố gắng đếm những gì bạn có thể gọi là "đường". Việc sử dụng wc
để đếm các dòng rất có thể dẫn đến sai sót, tùy thuộc vào EOF của tệp đầu vào của bạn.
Giải pháp tương thích POSIX
Bạn có thể sử dụng grep
để đếm các dòng giống như trong ví dụ trên. Giải pháp này vừa mạnh mẽ vừa chính xác hơn và nó hỗ trợ tất cả các hương vị khác nhau của dòng trong tệp của bạn có thể là:
$ grep -c ^ FILE
g <Ctrl-g>
, Nó sẽ hiển thị cho bạn số dòng, từ, cột và byte