chỉ lấy số nguyên từ wc trong bash


115

Có cách nào để lấy số nguyên mà wc trả về trong bash không?

Về cơ bản, tôi muốn ghi số dòng và số lượng từ ra màn hình sau tên tệp.

output: filename linecount wordcount Đây là những gì tôi có cho đến nay:

files=`ls`
for f in $files;
do
        if [ ! -d $f ] #only print out information about files !directories
        then
                # some way of getting the wc integers into shell variables and then printing them
                echo "$f $lines $ words"
        fi
done

Câu trả lời:


57

Bạn có thể sử dụng cutlệnh để chỉ nhận từ đầu tiên của wcđầu ra (là dòng hoặc số từ):

lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`

5
Chạy wc hai lần cho cùng một tệp không hiệu quả.
gawi 19/09/10

3
Đúng, đó là lý do tại sao tôi nghĩ câu trả lời của James Broadhead tốt hơn nhiều. Tôi không thể cutlàm việc với đầu ra đầy đủ wc $fvì số lượng khoảng trắng giữa các trường khác nhau.
casablanca

1
@casablanca Bạn có thể tăng số lượng khoảng trắng bằng cách sử dụng 'tr -s'. Tôi đã liệt kê các giải pháp di động hơn cho câu hỏi này trong câu trả lời của tôi bên dưới.
rúp

Vì trong câu trả lời này chúng ta gán cho một biến, chúng ta có thể giết chết các không gian với
cycollins

88

Câu trả lời đơn giản nhất từ ​​trước đến nay:

wc < filename 

5
Nhưng không tạo ra đầu ra mong muốn.
Dave Newton

chắc chắn là có, bạn chỉ cần chuyển các tham số thích hợp mà bạn sẽ làm. ví dụ, nếu bạn làm vậy wc -c < file name, nó sẽ chỉ cung cấp cho bạn số byte nguyên và không có gì khác.
BananaNeil,

13
Quan điểm của tôi là nếu bạn đang đi để trả lời một (1,5 năm tuổi) câu hỏi) cũng có thể đặt tất cả các thông tin vào câu trả lời, đó là tất cả :)
Dave Newton

rất tiếc, chỉ cần đọc lại câu hỏi .. #fail, tôi đang nghiên cứu cách chỉ lấy các số nguyên và tôi đang sử dụng thông tin từ một trong các câu trả lời, khi tôi phát hiện ra một câu trả lời hay hơn và sau đó quyết định đăng về nó. xin lỗi ..
BananaNeil

3
Bạn đã trả lời Google, đó là những gì quan trọng. :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

82

Chỉ:

wc -l < file_name

sẽ thực hiện công việc. Nhưng đầu ra này bao gồm khoảng trắng có tiền tố khi wccăn phải số.


3
Để có được chỉ đếm dòng không chứa khoảng trắng: wc -l < foo.txt | xargsref - stackoverflow.com/a/12973694/149428
Taylor Edmiston

1
Vì vậy, trong khi lệnh tạo ra câu trả lời với khoảng trắng ở đầu, người hỏi đã gán cho một biến và điều đó sẽ tự động loại bỏ khoảng trắng ở đầu (ít nhất đó là kinh nghiệm của tôi trên OSX cũ hơn). Nói cách khác, lines=`wc -l < $f`kết quả là một "dòng" biến có giá trị không có dấu cách ở đầu.
cycollins

Điều gì sẽ xảy ra nếu tôi đang đi ống với tìm? Tôi gặp lỗi: find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -lhoạt động tốt nhưng in mọi tệp. Nếu tôi sử dụng find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l <tôi sẽ gặp lỗi. parse error near '\n'
Nuno Gonçalves

55
wc $file | awk {'print "$4" "$2" "$1"'}

Điều chỉnh khi cần thiết cho bố cục của bạn.

Sẽ tốt hơn nếu sử dụng logic tích cực ("là một tệp") thay vì tiêu cực ("không phải là một thư mục")

[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}

1
Trên Windows của tôi trong Cmder (bash 4.4.12), điều này hoạt động: wc $file | awk '{print $4" "$2" "$1}'- dấu nháy đơn bên ngoài {}.
Grzegorz Gierlik

36

Đôi khi wc xuất ra ở các định dạng khác nhau trên các nền tảng khác nhau. Ví dụ:

Trong OS X:

$ echo aa | wc -l

         1

Trong Centos:

$ echo aa | wc -l

1

Vì vậy sử dụng chỉ cắt có thể không lấy lại số. Thay vào đó hãy thử xóa các ký tự khoảng trắng:

$ echo aa | wc -l | tr -d ' '

23

Các câu trả lời được chấp nhận / phổ biến không hoạt động trên OSX.

Bất kỳ phần mềm nào sau đây phải có thể di động trên bsd và linux.

wc -l < "$f" | tr -d ' '

HOẶC LÀ

wc -l "$f" | tr -s ' ' | cut -d ' ' -f 2

HOẶC LÀ

wc -l "$f" | awk '{print $1}'

11

Nếu bạn chuyển hướng tên tệp vào wcnó, hãy bỏ qua tên tệp trên đầu ra.

Bash:

read lines words characters <<< $(wc < filename)

hoặc là

read lines words characters <<EOF
$(wc < filename)
EOF

Thay vì sử dụng forđể lặp lại đầu ra của ls, hãy làm như sau:

for f in *

sẽ hoạt động nếu có tên tệp bao gồm khoảng trắng.

Nếu bạn không thể sử dụng globbing, bạn nên chuyển thành một while readvòng lặp:

find ... | while read -r f

hoặc sử dụng thay thế quy trình

while read -r f
do
    something
done < <(find ...)

Tôi vẫn ủng hộ bạn, nhưng bạn không cần phải chuyển hướng tên tệp. Chỉ cần nắm bắt nó như một trường bổ sung. read lines words characters filename <<< $(wc "$f")Ồ, và nếu bạn đã từng * được làm cứng với khoảng trắng, bạn cũng muốn trích dẫn gấp đôi var khi bạn sử dụng nó.
Bruno Bronosky

Sử dụng một biến bổ sung thực sự là một cách khác để làm điều đó, nhưng nếu bạn không sử dụng biến (có lẽ bạn đã có tên tệp trong một biến - $ftrong trường hợp này), thì không cần thiết. Ngoài ra, OP yêu cầu làm thế nào để chỉ lấy số nguyên. Bạn nói đúng về việc trích dẫn một biến, nhưng tôi không cho thấy việc sử dụng biến, vì vậy tôi đã bỏ qua điểm đó. Biểu for f in *mẫu hầu như luôn luôn được sử dụng thay vì sử dụng đầu ra của ls, như bạn biết.
Tạm dừng cho đến khi có thông báo mới.

Tôi hoàn toàn đồng ý về lsquan điểm. Điều đó sẽ giúp bạn nhận được giải thưởng. partmaps.org/era/unix/award.html#ls
Bruno Bronosky

Nếu bạn không muốn tên tệp, bạn có thể thực hiện việc này:read lines words characters _ <<< $(wc "$f")

@EvanTeitelman: Như đã thảo luận trong một vài nhận xét ở trên của bạn. $_chỉ là một biến khác.
Tạm dừng cho đến khi có thông báo mới.

3

Nếu tệp nhỏ, bạn có thể đủ khả năng gọi wchai lần và sử dụng một cái gì đó như sau, điều này tránh đưa vào một quá trình bổ sung:

lines=$((`wc -l "$f"`))
words=$((`wc -w "$f"`))

Đây $((...))Khai triển Số học của bash. Nó loại bỏ bất kỳ khoảng trắng nào khỏi đầu ra của wctrong trường hợp này.

Giải pháp này có ý nghĩa hơn nếu bạn cần một trong hai người linecount hoặc các Số từ.


2

Làm thế nào về với sed?

wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'


1

Hãy thử điều này cho kết quả số:
nlines = $ (wc -l <$ myfile)


0

Thử cái này:

wc `ls` | awk '{ LINE += $1; WC += $2 } END { print "lines: " LINE  " words: " WC }'

Nó tạo ra số dòng và số từ (LINE và WC), và tăng chúng với các giá trị được trích xuất từ ​​wc (sử dụng $ 1 cho giá trị của cột đầu tiên và $ 2 cho cột thứ hai) và cuối cùng in kết quả.


0

"Về cơ bản, tôi muốn viết số dòng và số từ ra màn hình sau tên tệp."

answer=(`wc $f`)
echo -e"${answer[3]}
lines:  ${answer[0]}
words:  ${answer[1]}
bytes:  ${answer[2]}"

Kết quả đầu ra: dòng myfile.txt: 10 từ: 20 byte: 120


0
files=`ls`
echo "$files" | wc -l | perl -pe "s#^\s+##"

Nếu bạn vẫn đang sử dụng perl, cũng có thể tính số từ trong Perl. Một cách tiếp cận tiết kiệm hơn sẽ là chuyển sangtr -d '[:space:]'
tripleee
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.