linux shell wc -c đếm ký tự +1


17

Tôi đã sử dụng lệnh wc -c để đếm số lượng ký tự nhưng nó cho tôi một số sai, số ký tự cộng với một ký tự làm ví dụ:

echo "k" | wc -c 

nó cho tôi 2 ký tự

vậy tại sao không phải là 1?


3
các -ctùy chọn là một đếm byte, không phải là một số ký tự
mcalex

1
-m, --chars in số lượng ký tự Tôi cũng đã sử dụng vấn đề tương tự
Mohammad Karmi

Bạn nói đúng, tôi nghĩ unicode là hai byte cho mỗi char, nhưng có vẻ như các chữ cái ascii trong uni vẫn là 1 byte. Tò mò. Tôi đang suy nghĩ EOL
mcalex

1
vâng, tôi đã gõ "k" trong một tệp và nó hiển thị 2 ký tự tôi đã xóa nó, vì vậy nó hiển thị 0 tò mò
Mohammad Karmi

Câu trả lời:


19

Hãy xem thông báo trợ giúp cho wc. Các -ctùy chọn in ra số ký tự. Các echolệnh bao gồm một ký tự xuống dòng theo mặc định. Khi wcnhìn thấy dòng mới, nó sẽ tính nó như một ký tự khác và do đó tính thêm vào kết quả của bạn. Bạn có thể khắc phục điều này bằng cách sử dụng một trong những lựa chọn thay thế được hiển thị bên dưới; -wđếm số lượng từ và -lđếm số dòng.

echo "k" | wc -w 
echo "k" | wc -l

Bạn có thể đường ống đầu ra của wcđể awkđể có được số ký tự không bao gồm các ký tự xuống dòng:

wc <filename> | awk '{print $3-$1}'

Đầu ra mặc định wckhông có tùy chọn in ra số lượng ký tự dòng mới ($ 1 đến awk), số lượng từ và số ký tự ($ 3 đến awk) theo thứ tự này.


ok, vậy là có một từ và một dòng, nhưng OP muốn biết tại sao có hai ký tự / byte
mcalex

Tôi muốn đếm số lượng ký tự không phải từ cũng không phải dòng
Mohammad Karmi

5
ahhh, vì vậy bạn có ý nghĩa echo -n "k" | wc -c. Điều đó có ý nghĩa
mcalex

Tôi đặt char trong tập tin và nó cung cấp để EOF được tính? hoặc dòng mới hay gì?, Vì tôi muốn đếm nhiều hơn một char
Mohammad Karmi

1
@ user1865719: printfthường được ưa thích trước đây echokhi tính nhất quán là quan trọng. Nó không in một dòng mới trừ khi được hỏi cụ thể, vì vậy , printf "k" | wc -mcho 1, tức là số lượng ký tự được in. Để đếm các ký tự trong dòng đầu tiên của tệp, người ta có thể làm ví dụ $(($(head -1 file | wc -m)-1))(bọc nó $(())để làm số học shell để loại bỏ số lượng dòng mới) hoặc thậm chí tốt hơn: sử dụng awk và do awk 'NR==1{print length}' file.
Daniel Andersson

12

khi bạn echo "k", echolệnh sẽ thêm một ký tự dòng mới vào bất cứ thứ gì bạn yêu cầu để in ra ("k"). Bạn có thể sử dụng -ntùy chọn để vô hiệu hóa điều này:

echo -n k | wc -c
1

Để xem nhân vật vô hình đó , bạn có thể kết xuất luồng odhoặc hd:

echo k | od -t c
0000000   k  \n

echo k | hd
00000000  6b 0a                                             |k.|

echo k | od -t a -A n
   k  nl

6

Đó là bởi vì bạn đang sử dụng echo (có trở lại vận chuyển), thay vào đó sử dụng printf:

$ echo k | wc -c 2

$ printf k | wc -c 1
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.