Tôi chắc chắn có nhiều cách để làm điều này: làm thế nào tôi có thể đếm số dòng trong một tệp văn bản?
$ <cmd> file.txt
1020 lines
Tôi chắc chắn có nhiều cách để làm điều này: làm thế nào tôi có thể đếm số dòng trong một tệp văn bản?
$ <cmd> file.txt
1020 lines
Câu trả lời:
Cách tiêu chuẩn là với wc
, lấy các đối số để chỉ định những gì cần đếm (byte, ký tự, từ, v.v.); -l
dành cho dòng:
$ wc -l file.txt
1020 file.txt
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
. /regexp/d
xóa một dòng nếu nó khớp regexp
và -e
bật một cú pháp (IMNSHO) đầy đủ cho regexp
.
grep -v '^+ *%' matlab.git.diff | wc -l
?
grep
lệnh của bạn để xem xét như các trường hợp nhận xét như " + Hello"
(lưu ý khoảng trắng trước +
) không?
grep -v '^ *+' matlab.git.diff | wc -l
(Tôi cho rằng các dấu hiệu trích dẫn không thực sự là một phần của dòng; Tôi cũng cho rằng cả hai dòng có và không có khoảng trắng ở phía trước +
đều có nghĩa là bình luận; ít nhất một không gian là bắt buộc, hoặc thay thế ngôi sao *
bằng \+
hoặc chỉ thêm một không gian khác ở phía trước ngôi sao). Có lẽ thay vì chỉ khớp các khoảng trắng, bạn muốn khớp các khoảng trắng tùy ý; cho điều này thay thế không gian với [[:space:]]
. Lưu ý rằng tôi cũng đã xóa khớp với %
vì nó không có trong ví dụ của bạn.
Như Michael đã nói, wc -l
là con đường để đi. Nhưng, chỉ trong trường hợp bạn không thể giải thích có bash
, perl
hoặc awk
nhưng không wc
, đây là một vài giải pháp hơn:
$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT
$ perl -lne 'END { print $. }' file.txt
và rất ít đọc được:
$ perl -lne '}{ print $.' file.txt
$ awk 'END {print NR}' file.txt
Steven D quên GNU sed
:
sed -n '$=' file.txt
Ngoài ra, nếu bạn muốn đếm mà không xuất tên tệp và bạn đang sử dụng wc
:
wc -l < file.txt
Chỉ vì cái quái quỷ của nó:
cat -n file.txt | tail -n 1 | cut -f1
grep -c ''
, hoặc tr -dc '\n' | wc -c
, hoặc nl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'
có bất kỳ thứ nào trong số này hữu ích trong chính nó (trái ngược với những thứ được xây dựng để tạo ra một chương trình không chỉ là đếm dòng), ngoài wc -l
và thuần (ba) sh?
sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
và bạn có thể cut -c -7
chỉ giữ số. Hoặc, POSIXly hơn : uniq -c file.txt | awk '{c+=$1}END{print c}'
. Còn về dc
(mặc dù nó không phải là POSIX)? uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -
. bc
là POSIX : uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc
. Câu trả lời dễ dàng nếu bạn giả sử độ dài dòng giới hạn : uniq -c -f 100000 file.txt
.
Lời cảnh báo khi sử dụng
wc -l
bởi vì wc -l hoạt động bằng cách đếm \ n, nếu dòng cuối cùng trong tệp của bạn không kết thúc ở dòng mới một cách hiệu quả thì số dòng sẽ bị tắt bởi 1. (do đó, quy ước cũ sẽ bỏ dòng mới ở cuối tệp của bạn)
Vì tôi không bao giờ có thể chắc chắn liệu có bất kỳ tệp đã cho nào tuân theo quy ước kết thúc dòng cuối cùng với một dòng mới hay không, tôi khuyên bạn nên sử dụng bất kỳ lệnh thay thế nào sẽ bao gồm dòng cuối cùng trong số bất kể dòng mới hay không.
sed -n $= filename
perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename
Trong trường hợp bạn chỉ có bash và hoàn toàn không có công cụ bên ngoài nào, bạn cũng có thể làm như sau:
count=0
while read
do
((count=$count+1))
done <file.txt
echo $count
Giải thích: vòng lặp đọc từng dòng đầu vào tiêu chuẩn ( read
vì chúng ta không làm gì với đầu vào đọc dù sao, không có biến nào được cung cấp để lưu trữ nó) và tăng biến count
mỗi lần. Do chuyển hướng ( <file.txt
sau done
), đầu vào tiêu chuẩn cho vòng lặp là từ file.txt
.