นับจำนวนบรรทัดในไฟล์บีบอัด


42

ถ้าฉันมีไฟล์. gz บน unix ซึ่งมีจำนวนบรรทัดที่แน่นอน ฉันจะนับบรรทัดบนยูนิกซ์ได้อย่างไรโดยไม่ต้องคลายการบีบอัด


คุณจะไม่สามารถนับจำนวนบรรทัดได้
zoli2k

คำตอบ:


60

เห็นได้ชัดว่าคุณไม่สามารถนับบรรทัดใหม่ได้หากไฟล์นั้นยังถูกบีบอัดอยู่

แต่คุณสามารถแตกไฟล์ออกเป็นสตรีมและนับบรรทัดใหม่ในสตรีมนั้นโดยไม่ต้องเขียนไฟล์ (แตกไฟล์) ลงในดิสก์ ที่จะไปเช่น:

zcat file.gz | wc -l

zcat สำหรับ decompress & cat, wc สำหรับ wordcount ดู man pages สำหรับทั้งคู่หากคุณต้องการทราบข้อมูลเพิ่มเติม

แก้ไข

หากคุณไม่ได้มี zcat, zcat gunzip -cเป็นเพียงชื่ออีก


7
บน Unices ที่gzipแตกต่างจากที่คุณต้องการcompress gzcat
coneslayer

7

สิ่งนี้ดูเหมือนว่าจะใช้งานได้ - grep สำหรับจำนวนของการสิ้นสุดบรรทัดในไฟล์

zgrep -Ec "$" file.gz

สิ่งนี้ให้คำตอบที่แตกต่าง (สูงกว่า) สำหรับฉันมากกว่าการไปที่wc -l
Stop Harming Monica

5

ถ้าคุณต้องการที่จะทำมันอย่างรวดเร็วฉันแนะนำให้ใช้ 'pigz' (ซึ่ง IIRC หมายถึง "การใช้งานแบบขนานของ GZip") ฉันเพิ่งมีสถานการณ์คล้ายกันที่ฉันต้องการนับจำนวนบรรทัดในไฟล์ gzip'ed จำนวนมากและนี่คือคำตอบของฉัน:

for x in *.gz; do unpigz -p 8 -c $x | wc -l && echo $x; done

ซึ่งทำให้ฉันมีจำนวนบรรทัดและไฟล์ที่นับจากบนสลับสายโดยใช้โปรเซสเซอร์ 8 มันวิ่งเร็ว!


1
หรือถ้า unpigz ไม่สามารถใช้ได้เพียงกับfor x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Calimo

2

ใช้คำสั่งนี้:

gzgrep -c $ filename.gz

คำสั่งgzgrepจะทำงานเหมือนกับgrepแต่บนไฟล์บีบอัด gzip มันขยายไฟล์ทันทีเพื่อการจับคู่ regex

ในกรณีนี้-cสั่งให้ออกคำสั่งจำนวนบรรทัดที่จับคู่และ regex $ตรงกับจุดสิ้นสุดของบรรทัดเพื่อให้ตรงกับทุกบรรทัดหรือไฟล์

gzip -dc filename.gz | grep -c $ผลสุดท้ายเป็นเหมือน


คือgzgrepมีอยู่ในระบบอื่น ๆ กว่า Solaris?
pabouk

1
ไม่บนระบบอื่น ๆ คำสั่งจะเป็น zgrep -c $ filename.gz
Ravi KM

1
แม้ว่าบางคนอาจคิดว่านี่ดีกว่า zcat + wc โดยสัญชาตญาณเมื่อฉันให้เวลา แต่ก็ใช้เวลาเท่ากัน
ngọcminh.oss

1

หากคุณโอเคกับการประมาณการคร่าวๆมากกว่าการนับที่แน่นอนและการแยกไฟล์ทั้งหมดหรือ zgrepping สำหรับการจบบรรทัดจะใช้เวลานานเกินไป (ซึ่งเป็นสถานการณ์ของฉันในตอนนี้) คุณสามารถ:

zcat "$file" | head -1000 > 1000-line-sample.txt
ls -ls 1000-line-sample.txt "$file"

ดังนั้นจำนวนเส้นโดยประมาณคือ1000 * (size of $file) / (size of 1000-line-sample)ตราบใดที่ข้อมูลของคุณเป็นเนื้อเดียวกันต่อบรรทัด


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