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