wc -l file.txt
đầu ra số lượng dòng và tên tập tin.
Tôi chỉ cần số chính nó (không phải tên tập tin).
tôi có thể làm điều này
wc -l file.txt | awk '{print $1}'
Nhưng có lẽ có một cách tốt hơn?
wc -l file.txt
đầu ra số lượng dòng và tên tập tin.
Tôi chỉ cần số chính nó (không phải tên tập tin).
tôi có thể làm điều này
wc -l file.txt | awk '{print $1}'
Nhưng có lẽ có một cách tốt hơn?
Câu trả lời:
Hãy thử cách này:
wc -l < file.txt
wc -l
không nên phát ra một cái, và tại sao ksh sẽ trả trước đầu ra tiêu chuẩn của một chương trình có khoảng trắng?
4711 [stdin]
là đầu ra.
printf "%'d"
, chăm sóc không gian và in ra số lượng lớn độc đáo.
cat file.txt | wc -l
Theo trang man (đối với phiên bản BSD, tôi không có phiên bản GNU để kiểm tra):
Nếu không có tệp nào được chỉ định, đầu vào tiêu chuẩn được sử dụng và không có tên tệp nào được hiển thị. Lời nhắc sẽ chấp nhận đầu vào cho đến khi nhận được EOF hoặc [^ D] trong hầu hết các môi trường.
wc -l < file.txt
có tác dụng tương tự.
wc -l < file.txt
để tránh việc sử dụng mèo vô dụng. Mặc dù bạn hoàn toàn điên rồ nếu bạn nghĩ rằng điều đó tiêu tốn bất kỳ thời gian đáng chú ý nào.
Để làm điều này mà không có không gian hàng đầu, tại sao không:
wc -l < file.txt | bc
wc -l < file.txt
để sửa lỗi phân tích cú pháp và xóa khoảng wc -l < file.txt | bc
Làm thế nào về
wc -l file.txt | cut -d' ' -f1
tức là dẫn đầu ra của wc
vào cut
(trong đó các dấu phân cách là khoảng trắng và chỉ chọn trường đầu tiên)
wc -l file.txt | awk '{print $1}'
OP đã thử.
wc -l < file.txt
phương pháp. Nhưng phải sử dụng | cut -d' ' -f2
trên BSD, miễn là wc
lệnh trả về một khoảng trắng hàng đầu, ví dụ: "34068289 file.txt", thay vì "34068289 file.txt".
Tôi gặp vấn đề tương tự khi cố gắng đếm số ký tự mà không có khoảng trắng hàng đầu được cung cấp bởi wc
, điều này dẫn tôi đến trang này. Sau khi thử các câu trả lời ở đây, sau đây là kết quả từ thử nghiệm cá nhân của tôi trên Mac (BSD Bash). Một lần nữa, đây là số lượng nhân vật; cho số lượng dòng bạn sẽ làm wc -l
. echo -n
bỏ qua dấu ngắt dòng.
FOO="bar"
echo -n "$FOO" | wc -c # " 3" (x)
echo -n "$FOO" | wc -c | bc # "3" (√)
echo -n "$FOO" | wc -c | tr -d ' ' # "3" (√)
echo -n "$FOO" | wc -c | awk '{print $1}' # "3" (√)
echo -n "$FOO" | wc -c | cut -d ' ' -f1 # "" for -f < 8 (x)
echo -n "$FOO" | wc -c | cut -d ' ' -f8 # "3" (√)
echo -n "$FOO" | wc -c | perl -pe 's/^\s+//' # "3" (√)
echo -n "$FOO" | wc -c | grep -ch '^' # "1" (x)
echo $( printf '%s' "$FOO" | wc -c ) # "3" (√)
Tôi sẽ không dựa vào cut -f*
phương pháp nói chung vì nó yêu cầu bạn biết chính xác số lượng không gian hàng đầu mà bất kỳ đầu ra cụ thể nào có thể có. Và grep
một trong những hoạt động để đếm dòng, nhưng không phải ký tự.
bc
là ngắn gọn nhất, và awk
và perl
dường như một overkill chút, nhưng tất cả họ nên được tương đối nhanh và đủ cầm tay.
Cũng lưu ý rằng một số trong số này có thể được điều chỉnh để cắt khoảng trắng xung quanh từ các chuỗi chung (cùng với echo `echo $FOO`
một thủ thuật gọn gàng khác).
echo $(printf '%s' "$FOO" | wc -c)
là một trong những trường hợp hiếm hoi khi echo
với một lệnh thay thế lệnh không vô dụng.
echo `echo $FOO`;
cũng hoạt động như lệnh String.trim () trên một biến! Đó là tiện dụng đáng kinh ngạc. Tôi cũng sẽ thêm dòng của bạn vào câu trả lời của tôi.
printf
tốt hơn echo
?
Rõ ràng, có rất nhiều giải pháp cho việc này. Đây là một cái khác mặc dù:
wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"
Điều này chỉ xuất ra số lượng dòng, nhưng ký tự dòng mới ( \n
) có mặt, nếu bạn không muốn điều đó, thay thế [:blank:]
bằng [:space:]
.
test9
có 1 dòng trong đó, đầu ra sẽ là 19.
Cách tốt nhất trước hết là tìm tất cả các tệp trong thư mục sau đó sử dụng AWK NR (Số lượng bản ghi biến)
bên dưới là lệnh:
find <directory path> -type f | awk 'END{print NR}'
thí dụ : - find /tmp/ -type f | awk 'END{print NR}'
wc -l < file.txt
thực hiện công việc một cách chính xác và chính xác.