ถ้าฉันมีไฟล์. gz บน unix ซึ่งมีจำนวนบรรทัดที่แน่นอน ฉันจะนับบรรทัดบนยูนิกซ์ได้อย่างไรโดยไม่ต้องคลายการบีบอัด
ถ้าฉันมีไฟล์. gz บน unix ซึ่งมีจำนวนบรรทัดที่แน่นอน ฉันจะนับบรรทัดบนยูนิกซ์ได้อย่างไรโดยไม่ต้องคลายการบีบอัด
คำตอบ:
เห็นได้ชัดว่าคุณไม่สามารถนับบรรทัดใหม่ได้หากไฟล์นั้นยังถูกบีบอัดอยู่
แต่คุณสามารถแตกไฟล์ออกเป็นสตรีมและนับบรรทัดใหม่ในสตรีมนั้นโดยไม่ต้องเขียนไฟล์ (แตกไฟล์) ลงในดิสก์ ที่จะไปเช่น:
zcat file.gz | wc -l
zcat สำหรับ decompress & cat, wc สำหรับ wordcount ดู man pages สำหรับทั้งคู่หากคุณต้องการทราบข้อมูลเพิ่มเติม
แก้ไข
หากคุณไม่ได้มี zcat, zcat gunzip -c
เป็นเพียงชื่ออีก
gzip
แตกต่างจากที่คุณต้องการcompress
gzcat
สิ่งนี้ดูเหมือนว่าจะใช้งานได้ - grep สำหรับจำนวนของการสิ้นสุดบรรทัดในไฟล์
zgrep -Ec "$" file.gz
wc -l
ถ้าคุณต้องการที่จะทำมันอย่างรวดเร็วฉันแนะนำให้ใช้ 'pigz' (ซึ่ง IIRC หมายถึง "การใช้งานแบบขนานของ GZip") ฉันเพิ่งมีสถานการณ์คล้ายกันที่ฉันต้องการนับจำนวนบรรทัดในไฟล์ gzip'ed จำนวนมากและนี่คือคำตอบของฉัน:
for x in *.gz; do unpigz -p 8 -c $x | wc -l && echo $x; done
ซึ่งทำให้ฉันมีจำนวนบรรทัดและไฟล์ที่นับจากบนสลับสายโดยใช้โปรเซสเซอร์ 8 มันวิ่งเร็ว!
for x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
ใช้คำสั่งนี้:
gzgrep -c $ filename.gz
คำสั่งgzgrep
จะทำงานเหมือนกับgrep
แต่บนไฟล์บีบอัด gzip มันขยายไฟล์ทันทีเพื่อการจับคู่ regex
ในกรณีนี้-c
สั่งให้ออกคำสั่งจำนวนบรรทัดที่จับคู่และ regex $
ตรงกับจุดสิ้นสุดของบรรทัดเพื่อให้ตรงกับทุกบรรทัดหรือไฟล์
gzip -dc filename.gz | grep -c $
ผลสุดท้ายเป็นเหมือน
gzgrep
มีอยู่ในระบบอื่น ๆ กว่า Solaris?
หากคุณโอเคกับการประมาณการคร่าวๆมากกว่าการนับที่แน่นอนและการแยกไฟล์ทั้งหมดหรือ 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)
ตราบใดที่ข้อมูลของคุณเป็นเนื้อเดียวกันต่อบรรทัด
gzip -cd <file.gz> | wc -l
สิ่งนี้ใช้ได้สำหรับฉัน