Làm cách nào để có được wc-lv để chỉ in số dòng mà không có tên tập tin?


154
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?


13
wc -l < file.txtthực hiện công việc một cách chính xác và chính xác.
Jonathan Leffler


3
Đây là một câu hỏi tôi đã tìm kiếm hai lần bây giờ. Hành vi này của wc là không trực quan và chống nghịch lý cho -nix sự căng thẳng thông thường. Sự căng thẳng đó là có lý do, bởi vì bạn chính xác không muốn làm việc xung quanh tất cả các loại dư thừa lông mịn. Rốt cuộc, tôi biết tên tập tin, phải không? Những gì tôi muốn là số lượng dòng.
Peter - Tái lập Monica

Câu trả lời:


216

Hãy thử cách này:

wc -l < file.txt

5
Trong AIX, ksh, điều này sẽ luôn có một khoảng trống đặt trước số. Chúng ta phải sử dụng | awk '{print $ 1}' hoặc cắt, để cắt bớt khoảng trắng. Một cách khác để cắt sẽ là kèm theo tiếng vang.
rao

@rao là chính xác, điều này sẽ thêm một khoảng trắng trước số. Giải pháp của tôi giải quyết điều này và đơn giản hơn awk hoặc cắt.
Desi Cochrane

@rao Không có không gian với bash. Không gian đến từ đâu trong ksh? wc -lkhô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?
Peter - Tái lập Monica

Mặc dù đây là cách giải quyết chính xác (và đủ dễ để wc không bao giờ được sửa đổi), nhưng nó có thể chậm hơn và không trực quan. Đối với một, tôi mong đợi một cái gì đó như 4711 [stdin]là đầu ra.
Peter - Tái lập Monica

Cũng xem xét ghép nối với printf "%'d", chăm sóc không gian và in ra số lượng lớn độc đáo.
Leo

21
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.


3
Tôi không thích mèo - việc ghép nối tiêu tốn nhiều thời gian.
PoGibas

9
wc -l < file.txtcó tác dụng tương tự.
pjmorse

@user: Kiểm tra nó. Phần chậm nhất sẽ là đọc tệp ra đĩa.
sarnold

11
@ user1286528 sau đó sử dụng 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.
hobbs

12

Để 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

Tôi gặp lỗi cú pháp với điều này (Ubuntu 14.04). Tôi nghĩ rằng có một vấn đề với tên tệp.
MERose 7/07/2015

Trên RHEL 6.7, nó phát sinh lỗi: $ wc -l file.csv | bc (standard_in) 1: lỗi cú pháp (standard_in) 1: ký tự không hợp lệ: N (standard_in) 1: lỗi cú pháp (standard_in) 1: lỗi cú pháp
Rodrigo Hjort

3
Tôi cũng gặp lỗi phân tích cú pháp, nhưng bạn có thể kết hợp câu này với câu trả lời khác để sử dụng 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
trắng

11

Làm thế nào về

wc -l file.txt | cut -d' ' -f1

tức là dẫn đầu ra của wcvà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)


4
Điều này không tốt hơn wc -l file.txt | awk '{print $1}'OP đã thử.
doubleDown

1
Nhanh hơn wc -l < file.txtphương pháp. Nhưng phải sử dụng | cut -d' ' -f2trên BSD, miễn là wclệnh trả về một khoảng trắng hàng đầu, ví dụ: "34068289 file.txt", thay vì "34068289 file.txt".
Sopalajo de Arrierez

@doubleDown tốt, sử dụng awk cũng giống như sử dụng máy CNC để cắt bảng thay vì cưa. Sử dụng cưa để cưa.
Peter - Tái lập Monica

5

So sánh kỹ thuật

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 -nbỏ 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à grepmột trong những hoạt động để đếm dòng, nhưng không phải ký tự.

bclà ngắn gọn nhất, và awkperldườ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).


1
echo $(printf '%s' "$FOO" | wc -c)là một trong những trường hợp hiếm hoi khi echovới một lệnh thay thế lệnh không vô dụng.
tripleee

@tripleee Whoa ... dựa trên mã của bạn, 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.
Beejor

Có lẽ đối với bối cảnh cũng xem Khi nào nên trích dẫn xung quanh một biến shell
tripleee 7/11/18


4

Làm thế nào về

grep -ch "^" file.txt

3
Đẹp. Việc sử dụng rất nguyên bản / sáng tạo grepnhưng kiểm tra điều này hóa ra (không có gì đáng ngạc nhiên) chậm hơn từ 2 đến 6 lần so với wcphương pháp đơn giản / đơn giản hơn trong các thử nghiệm của tôi.
arielf

3

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:].


Điều này có vấn đề khi tên tập tin có một số trong đó. Ví dụ: với tệp test9có 1 dòng trong đó, đầu ra sẽ là 19.
Raphael Ahrens

1

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}'


0

Điều này làm việc cho tôi bằng cách sử dụng bình thường wc -lsedđể loại bỏ bất kỳ char nào không phải là số.

wc -l big_file.log | sed -E "s/([a-z\-\_\.]|[[:space:]]*)//g"

# 9249133
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.