ฉันแน่ใจว่ามีหลายวิธีในการทำเช่นนี้ฉันจะนับจำนวนบรรทัดในไฟล์ข้อความได้อย่างไร
$ <cmd> file.txt
1020 lines
ฉันแน่ใจว่ามีหลายวิธีในการทำเช่นนี้ฉันจะนับจำนวนบรรทัดในไฟล์ข้อความได้อย่างไร
$ <cmd> file.txt
1020 lines
คำตอบ:
วิธีมาตรฐานอยู่กับwc
ซึ่งใช้อาร์กิวเมนต์เพื่อระบุสิ่งที่ควรนับ (ไบต์ตัวอักษรคำ ฯลฯ ); -l
สำหรับสาย:
$ wc -l file.txt
1020 file.txt
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
perfomed): /regexp/d
ลบบรรทัดว่ามันตรงregexp
และ-e
เปิดเพียงพอ (IMNSHO) regexp
ไวยากรณ์สำหรับ
grep -v '^+ *%' matlab.git.diff | wc -l
?
grep
คำสั่งของคุณเพื่อพิจารณาเป็นกรณีความคิดเห็นเช่น" + Hello"
(สังเกตช่องว่างก่อน+
)
grep -v '^ *+' matlab.git.diff | wc -l
(ฉันสมมติว่าเครื่องหมายคำพูดไม่ได้หมายถึงการเป็นส่วนหนึ่งของบรรทัดฉันยังสมมติว่าทั้งสองบรรทัดที่มีและไม่มีช่องว่างด้านหน้า+
จะถูกแสดงความคิดเห็นหากที่ จำเป็นต้องเว้นวรรคอย่างน้อยหนึ่งอันแทนที่ดาว*
ด้วย\+
หรือเพียงแค่เพิ่มช่องว่างด้านหน้าดาว) อาจแทนที่จะจับคู่ช่องว่างเท่านั้นคุณต้องการจับคู่ช่องว่างโดยพลการ [[:space:]]
สำหรับเรื่องนี้แทนที่พื้นที่ที่มี โปรดทราบว่าฉันได้ลบรายการที่ตรงกัน%
เนื่องจากไม่ใช่ในตัวอย่างของคุณ
อย่างที่ไมเคิลพูดwc -l
นั่นคือหนทางที่จะไป แต่ในกรณีที่คุณลึกลับมีbash
, perl
หรือawk
แต่ไม่wc
นี่เป็นโซลูชั่นอีกไม่กี่:
$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT
$ perl -lne 'END { print $. }' file.txt
และอ่านได้น้อยกว่ามาก:
$ perl -lne '}{ print $.' file.txt
$ awk 'END {print NR}' file.txt
Steven D ลืม GNU sed
:
sed -n '$=' file.txt
นอกจากนี้หากคุณต้องการการนับโดยไม่แสดงชื่อไฟล์และคุณใช้wc
:
wc -l < file.txt
เพียงแค่ห่ามมัน
cat -n file.txt | tail -n 1 | cut -f1
grep -c ''
, หรือtr -dc '\n' | wc -c
, หรือnl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'
... สิ่งเหล่านี้มีประโยชน์ในตัวเอง (ตรงข้ามกับสิ่งที่ต้องสร้างเพื่อสร้างโปรแกรมที่ทำมากกว่าการนับบรรทัด), อื่น ๆwc -l
และบริสุทธิ์ (ba) sh?
sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
และคุณสามารถcut -c -7
เก็บหมายเลขได้เท่านั้น หรือ POSIXly uniq -c file.txt | awk '{c+=$1}END{print c}'
เพิ่มเติมได้ที่: วิธีการเกี่ยวกับdc
(แม้ว่าจะไม่ใช่ POSIX) uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -
. bc
เป็น uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc
POSIX: คำตอบง่ายถ้าคุณถือว่าความยาวสาย จำกัดuniq -c -f 100000 file.txt
:
คำเตือนเมื่อใช้
wc -l
เนื่องจาก wc -l ฟังก์ชั่นโดยการนับ \ n หากบรรทัดสุดท้ายในไฟล์ของคุณไม่ได้ขึ้นบรรทัดใหม่อย่างมีประสิทธิภาพการนับบรรทัดจะถูกปิดโดย 1 (ดังนั้นการประชุมเก่าออกจากบรรทัดใหม่ที่ท้ายไฟล์ของคุณ)
เนื่องจากฉันไม่สามารถมั่นใจได้ว่าไฟล์ใดก็ตามที่ได้รับมาตามแบบแผนของการสิ้นสุดบรรทัดสุดท้ายด้วยการขึ้นบรรทัดใหม่หรือไม่ฉันขอแนะนำให้ใช้คำสั่งทางเลือกใด ๆ เหล่านี้ซึ่งจะรวมบรรทัดสุดท้ายในการนับโดยไม่คำนึงถึง newline หรือไม่
sed -n $= filename
perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename
ในกรณีที่คุณทุบตีเท่านั้นและไม่มีเครื่องมือภายนอกให้ใช้งานคุณสามารถทำสิ่งต่อไปนี้ได้:
count=0
while read
do
((count=$count+1))
done <file.txt
echo $count
คำอธิบาย: ลูปอ่านบรรทัดอินพุตมาตรฐานทีละบรรทัด ( read
เนื่องจากเราไม่ได้ทำสิ่งใดกับอินพุตอ่านต่อดังนั้นจึงไม่มีตัวแปรที่จัดเก็บไว้ใน) และเพิ่มตัวแปรcount
ในแต่ละครั้ง เนื่องจากการเปลี่ยนเส้นทาง ( <file.txt
หลังdone
), file.txt
เข้ามาตรฐานสำหรับวงที่มาจาก
คุณสามารถใช้คำสั่งgrep
ดังนี้:
grep -c "^" file.txt
มันจะนับแถวจริงทั้งหมดfile.txt
ไม่ว่าแถวสุดท้ายจะมีอักขระ LF อยู่ที่ท้ายหรือไม่