linux shell wc -c จำนวนอักขระ +1


17

ฉันใช้คำสั่ง wc -c เพื่อนับจำนวนตัวอักษร แต่ให้หมายเลขผิดจำนวนตัวอักษรบวกหนึ่งเป็นตัวอย่าง:

echo "k" | wc -c 

มันทำให้ฉันมี 2 ตัวอักษร

ดังนั้นทำไมไม่ 1


3
-cตัวเลือกคือการนับไบต์ไม่ได้นับจำนวนตัวอักษร
mcalex

1
-m, --chars พิมพ์จำนวนตัวละครที่ฉันใช้ปัญหาเดียวกันนี้ด้วย
Mohammad Karmi

คุณพูดถูกฉันคิดว่ายูนิโค้ดคือสองไบต์ต่อถ่าน แต่ดูเหมือนว่าตัวอักษร ASCII ในหน่วยเดียวยังคงเป็น 1 ไบต์ อยากรู้อยากเห็น ฉันกำลังคิด EOL
mcalex

1
ใช่ฉันพิมพ์ "k" ในไฟล์และมันแสดง 2 ตัวอักษรที่ฉันลบมันดังนั้นมันจึงแสดง 0 อยากรู้อยากเห็น
Mohammad Karmi

คำตอบ:


19

wcลองดูที่ข้อความช่วยเหลือสำหรับ -cตัวเลือกพิมพ์ออกจำนวนตัวอักษร echoคำสั่งรวมถึงตัวละครขึ้นบรรทัดใหม่โดยค่าเริ่มต้น เมื่อwcเห็นบรรทัดใหม่มันจะนับว่าเป็นตัวละครอื่นและด้วยเหตุนี้การนับเพิ่มเติมในผลลัพธ์ของคุณ คุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยใช้ทางเลือกใดตัวเลือกหนึ่งที่แสดงด้านล่าง -wนับจำนวนคำและ-lนับจำนวนบรรทัด

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

คุณสามารถไพพ์เอาต์พุตของwcถึงawkเพื่อรับจำนวนอักขระที่ไม่รวมอักขระบรรทัดใหม่:

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

เอาต์พุตเริ่มต้นของที่wcไม่มีตัวเลือกจะพิมพ์จำนวนอักขระบรรทัดใหม่ ($ 1 ถึง awk) จำนวนคำและจำนวนอักขระ ($ 3 ถึง awk) ตามลำดับนี้


ตกลงดังนั้นจึงมีหนึ่งคำและหนึ่งบรรทัด แต่ OP ต้องการทราบว่าทำไมมีสองตัวอักษร / ไบต์
mcalex

ฉันต้องการนับจำนวนตัวอักษรที่ไม่ใช่คำหรือบรรทัด
Mohammad Karmi

6
อ่าคุณหมายความว่าecho -n "k" | wc -cไง นั่นทำให้รู้สึก
mcalex

ฉันใส่ถ่านในไฟล์และมันให้ EOF นับไหม หรือบรรทัดใหม่หรืออะไรอย่างที่ฉันต้องการนับมากกว่าหนึ่งตัวอักษร
Mohammad Karmi

2
@ user1865719: printfมักจะต้องการก่อนechoเมื่อความสอดคล้องเป็นสิ่งสำคัญ มันไม่ได้พิมพ์ขึ้นบรรทัดใหม่เว้นแต่จะมีการถามเป็นการเฉพาะดังนั้นprintf "k" | wc -mให้1เช่นจำนวนตัวอักษรที่พิมพ์ จะนับตัวอักษรในบรรทัดแรกของไฟล์หนึ่งสามารถทำเช่น$(($(head -1 file | wc -m)-1))(ห่อไว้ใน$(())ที่จะทำเลขคณิตเปลือกเพื่อลบนับบรรทัดใหม่) หรือดียิ่งขึ้นใช้งาน: ใช้ awk awk 'NR==1{print length}' fileและทำ
Daniel Andersson

13

เมื่อคุณecho "k"ที่echoคำสั่งผนวกอักขระ newline สิ่งที่คุณถามมันจะพิมพ์ออกมา ( "k") คุณสามารถใช้-nตัวเลือกเพื่อปิดการใช้งานนี้:

echo -n k | wc -c
1

สำหรับการดูตัวละครที่มองไม่เห็นคุณสามารถถ่ายโอนสตรีมด้วยodหรือ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

เป็นเพราะคุณกำลังใช้echoงานซึ่งจะเพิ่มบรรทัดใหม่ให้กับสตริงของคุณ ใช้printfแทน:

$ echo k | wc -c 
       2
$ printf k | wc -c
       1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.