Làm thế nào để tôi đếm dòng văn bản?


14

Làm thế nào để tôi đếm có bao nhiêu dòng trong tệp văn bản. ví dụ :

command file.txt

Lưu ý, tôi muốn chỉ đếm các dòng không trống (các dòng mà không tính khoảng trắng và các tab)?.



4
Câu hỏi không được xác định rõ: một dòng chỉ có khoảng trắng (khoảng trắng và TAB) được coi là trống?
Rmano

Đóng cử tri : Câu hỏi được chỉnh sửa sau khi làm rõ của @ Rmano theo nhận xét của OP. Vì vậy, xin đừng bỏ phiếu để gần như không rõ ràng
αғsнιη

2
@KasiyA vẫn chưa rõ. Tôi không hiểu nếu OP muốn đếm dòng sa chỉ với khoảng trắng (dấu cách, tab \r) hoặc bỏ qua chúng. Các câu trả lời hiện tại tất cả các dòng đếm có khoảng trắng và chỉ bỏ qua các dòng trống.
terdon 19/03/2015

@terdon OP KHÔNG muốn đếm các dòng trống (bao gồm các dòng trống ( \rhoặc \n), các dòng chỉ có các tab và các dòng chỉ có khoảng trắng) và muốn bỏ qua chúng khi tôi nghĩ và trả lời theo Những gì tôi hiểu.
αғsнιη

Câu trả lời:


11

Câu trả lời trên là chính xác nhưng hơi khác nhau, bạn có thể sử dụng grepđể mã dễ dàng hơn như vậygrep -vc '^$' file.txt

Ví dụ: (A): file.txt

$grep -vc '^$' file.txt

1    First line         #This is two tabs to comment.
2    
4
3    Fourth line        #Another two tabs to comment.

$2

Ví dụ: (B): file.txt

$sed '/^$/d' file.txt | wc -l

1    First line         #This is two tabs to comment.
2    
4
3    Fourth line        #Another two tabs to comment.

$4

Lưu ý kết quả là 4! khi chúng ta muốn chỉ có hai nhưng điều này cũng tính các tab ở giữa nội dung và bình luận.

Lưu ý số đếm từ 0 và đếm từ 1 khác với grep đến sed như tôi nhớ để biết thêm chi tiết tìm kiếm grep hoặc sed.


1
Cả hai ví dụ của bạn sẽ đếm các dòng trống, nhưng OP đã yêu cầu một lệnh để đếm mọi thứ NHƯNG các dòng trống
kos

2
Trên thực tế tôi đã sai, sedtùy chọn này thực sự chính xác, nhưng lựa chọn grepthì không
kos

Chỉ đúng một phần Tôi đã đánh giá thấp câu trả lời, hãy gửi cho tôi một nhận xét khi bạn đã sửa nó để tôi có thể xóa downvote của mình
kos

1
@kos Tôi khá chắc chắn, bạn có để ý câu hỏi mơ hồ như thế nào không?
amrx 19/03/2015

2
@kos, Bạn đã ở ngay từ đầu, Cảm ơn bạn. Tôi đã không ngủ trong hơn 36 giờ, tôi đoán đã đến giờ đi ngủ!
amrx 19/03/2015

12

Hãy thử sed:

sed '/^$/d' file.txt | wc -l

Nếu bạn có bất kỳ dòng nào chỉ chứa khoảng trắng hoặc tab và nếu bạn muốn bỏ qua chúng cũng như đếm:

sed '/^[[:blank:]]*$/d' file.txt | wc -l

3
Tôi cũng sẽ sử dụng ^\s*$để đưa vào các dòng tài khoản chỉ chứa tab hoặc dấu cách.
Sylvain Pineau

@SylvainPineau: Đã thêm ..
heemayl

1
Tôi đồng ý rằng câu hỏi của OP không rõ ràng, nhưng văn bản có dấu cách / tab có thể thay đổi kết quả mong đợi, +1.
Sylvain Pineau

3

Sử dụng grep:

grep -vc '^$' file  # or
grep -vc '^\s*$' file    

3

Bạn có thể dùng:

grep -cve '^\s*$' file.txt

Nếu bạn cần một lệnh cho điều đó, chỉ cần dán các dòng sau vào .bashrcvà khởi động lại phiên shell của bạn hoặc mở một thiết bị đầu cuối mới:

count_lines()
{
    grep -cve '^\s*$' $1
}

Thí dụ:

count_lines file.txt
42

2

Với :

awk 'NF{++count} END{print count}' file

Giải trình:

Biểu thị NFcho biết tổng số trường và do đó, chỉ in các dòng không trống , vì trong các dòng không trống NFlớn hơn 0và đánh giá là đúng. Vì vậy, tăng cờ đếm khi awk tìm thấy một dòng không trống và in giá trị mới nhất của cờ đếm ở cuối END{print count}.


1

Chỉnh sửa : bạn chỉ có thể thêm ctùy chọn grepthay vì đặt mọi thứ vào wc, xem câu trả lời của @ muru cho phiên bản nhỏ gọn hơn


Với grep:

grep -v '^$' file.txt | wc -l

0

Giải pháp Perl

Perl có thể làm điều đó. Nói chung, các dòng đếm hoạt động như vậy:

$ perl -ne 'END{print $.}' input.txt                                                                                     

Nếu chúng tôi muốn loại trừ tất cả các dòng trống, chúng tôi sẽ làm một cái gì đó như thế này:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             

Giả sử chúng ta có tệp đầu vào như thế này

$ cat -n input.txt
     1  Cat; Dog; Squirrel
     2  ORGANISM Animalus terrus
     3  
     4  Sequence: ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
     5  

Có tổng cộng 5 dòng, 2 dòng trống. Lệnh chúng ta sẽ xuất ra:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             
3

Cải thiện nhiều tập tin

Điều này hoạt động tốt cho một tập tin duy nhất. Nếu chúng ta muốn nó hoạt động trên nhiều tệp, chúng ta có thể làm một cái gì đó như thế này:

$ perl -ne '$c+=1 if not /^$|^\s+$/;printf("%d %s\n",$c,$ARGV) and $c=0 if eof' input.txt /etc/passwd                    
3 input.txt
52 /etc/passwd
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.