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ทำงานได้อย่างแม่นยำและรัดกุม