wc -l file.txt
ส่งออกจำนวนบรรทัดและชื่อไฟล์
ฉันต้องการเพียงตัวเลขเอง (ไม่ใช่ชื่อไฟล์)
ฉันสามารถทำได้
wc -l file.txt | awk '{print $1}'
แต่อาจจะมีวิธีที่ดีกว่า
wc -l file.txt
ส่งออกจำนวนบรรทัดและชื่อไฟล์
ฉันต้องการเพียงตัวเลขเอง (ไม่ใช่ชื่อไฟล์)
ฉันสามารถทำได้
wc -l file.txt | awk '{print $1}'
แต่อาจจะมีวิธีที่ดีกว่า
คำตอบ:
ลองด้วยวิธีนี้:
wc -l < file.txt
wc -l
ไม่ควรปล่อยหนึ่งและทำไม ksh จะเติมเอาต์พุตมาตรฐานของโปรแกรมด้วยช่องว่าง?
4711 [stdin]
เอาท์พุท
printf "%'d"
ซึ่งดูแลพื้นที่และพิมพ์จำนวนมากอย่าง
cat file.txt | wc -l
ตามหน้า man (สำหรับรุ่น BSD ฉันไม่มี GNU version เพื่อตรวจสอบ):
หากไม่ได้ระบุไฟล์จะใช้อินพุตมาตรฐานและไม่มีชื่อไฟล์แสดงขึ้น พรอมต์จะยอมรับอินพุตจนกว่าจะได้รับ EOF หรือ [^ D] ในสภาพแวดล้อมส่วนใหญ่
wc -l < file.txt
มีผลเหมือนกัน
wc -l < file.txt
เพื่อหลีกเลี่ยงการใช้แมวที่ไร้ประโยชน์ แม้ว่าคุณจะเป็นคนบ้าอย่างแน่นอนถ้าคุณคิดว่ามันใช้เวลาที่สังเกตได้
หากต้องการทำสิ่งนี้โดยไม่มีช่องว่างนำทำไม:
wc -l < file.txt | bc
wc -l < file.txt
ในการแก้ไขข้อผิดพลาดในการแยกวิเคราะห์และถอดพื้นที่:wc -l < file.txt | bc
เกี่ยวกับ
wc -l file.txt | cut -d' ' -f1
ie ไปป์เอาท์พุทของwc
เข้าสู่cut
(ที่ตัวคั่นเป็นช่องว่างและเลือกเพียงสนามแรก)
wc -l file.txt | awk '{print $1}'
OP ที่ได้ลองไปแล้ว
wc -l < file.txt
วิธี แต่ต้องใช้| cut -d' ' -f2
กับ BSD ตราบใดที่wc
คำสั่งส่งคืนพื้นที่นำหน้าตัวอย่าง: "34068289 file.txt" แทนที่จะเป็น "34068289 file.txt"
ฉันมีปัญหาคล้ายกันที่พยายามรับจำนวนตัวอักษรโดยไม่มีช่องว่างwc
นำหน้าซึ่งให้ฉันมาที่หน้านี้ หลังจากลองคำตอบที่นี่ต่อไปนี้เป็นผลลัพธ์จากการทดสอบส่วนตัวของฉันใน Mac (BSD Bash) นี่คือการนับจำนวนตัวอักษร wc -l
สำหรับสายการนับที่คุณต้องการจะทำอย่างไร echo -n
ละเว้นตัวแบ่งบรรทัดต่อท้าย
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" (√)
ฉันจะไม่พึ่งพาcut -f*
วิธีการทั่วไปเนื่องจากต้องการให้คุณทราบจำนวนช่องว่างที่แน่นอนที่มีเอาต์พุตใด ๆ และอันนั้นgrep
ใช้ได้กับการนับจำนวนบรรทัด
bc
มีความรัดกุมที่สุดawk
และperl
ดูเกินความจริงเล็กน้อย แต่ทั้งหมดนี้ควรจะค่อนข้างเร็วและพกพาได้เพียงพอ
นอกจากนี้โปรดทราบว่าบางส่วนของสิ่งเหล่านี้สามารถปรับให้เข้ากับการตัดช่องว่างโดยรอบจากสายทั่วไปได้เช่นกัน (รวมถึงecho `echo $FOO`
กลอุบายอื่น ๆ )
echo $(printf '%s' "$FOO" | wc -c)
เป็นหนึ่งในโอกาสที่หายากเมื่อecho
มีคำสั่งย่อยไม่ได้ไร้ประโยชน์
echo `echo $FOO`;
ก็เหมือนกับคำสั่ง String.trim () บนตัวแปร! มันมีประโยชน์อย่างน่าอัศจรรย์ ฉันจะเพิ่มบรรทัดของคุณในคำตอบของฉันด้วย
printf
ดีกว่าecho
?
เกี่ยวกับ
grep -ch "^" file.txt
grep
แต่การตรวจสอบสิ่งนี้ปรากฎ (ไม่แปลกใจ) ว่าจะช้าลงเป็น 2x ถึง 6x กว่าวิธีที่เรียบง่าย / ตรงไปตรงมาwc
ในการทดสอบของฉัน
เห็นได้ชัดว่ามีวิธีแก้ไขปัญหานี้มากมาย นี่คืออีกหนึ่งแม้ว่า:
wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"
นี้เท่านั้น outputs จำนวนเส้น แต่ตัวอักษรต่อท้ายบรรทัดใหม่ ( \n
) เป็นปัจจุบันถ้าคุณไม่ต้องการที่ทั้งแทนที่ด้วย[:blank:]
[:space:]
test9
มี 1 บรรทัดในนั้นเอาต์พุตจะเป็น 19
วิธีที่ดีที่สุดคืออันดับแรกค้นหาไฟล์ทั้งหมดในไดเรกทอรีจากนั้นใช้ AWK NR (Number of Records Variable)
ด้านล่างเป็นคำสั่ง:
find <directory path> -type f | awk 'END{print NR}'
ตัวอย่าง: - find /tmp/ -type f | awk 'END{print NR}'
มันใช้งานได้สำหรับฉันโดยใช้แบบปกติwc -l
และsed
เพื่อลบอักขระใด ๆ ที่ไม่ใช่ตัวเลข
wc -l big_file.log | sed -E "s/([a-z\-\_\.]|[[:space:]]*)//g"
# 9249133
wc -l < file.txt
ทำงานได้อย่างแม่นยำและรัดกุม