menghitung baris dalam file terkompresi

43

jika saya memiliki file .gz di unix yang memiliki sejumlah baris. Bagaimana saya bisa menghitung garis pada unix tanpa membuka kompresnya.

Vijay
sumber
Tanpa mengekstrak arsip Anda tidak dapat menghitung garis.
zoli2k
Lihat stackoverflow.com/questions/846062/wc-gzipped-files
sancho.s Reinstate Monica

Jawaban:

61

Anda jelas tidak dapat menghitung baris baru jika file masih dikompresi.

Tapi Anda bisa mendekompres ke aliran, dan menghitung baris baru di aliran itu, tanpa pernah menulis file (didekompresi) ke disk. Itu akan menjadi seperti ini:

zcat file.gz | wc -l

zcat untuk dekompresi & kucing, wc untuk wordcount. Lihat halaman manual untuk keduanya jika Anda ingin tahu lebih banyak.

EDIT

Jika Anda tidak memiliki zcat, zcat hanyalah nama lain untuk gunzip -c.


sumber
7
Pada Unices tempat gzipberbeda compress, Anda inginkan gzcat.
pemain coneslayer
7

Ini tampaknya juga berfungsi - grep untuk jumlah akhir baris dalam file

zgrep -Ec "$" file.gz
Patrick Wright
sumber
Ini memberikan jawaban yang berbeda (jauh lebih tinggi) bagi saya daripada pipa untukwc -l
Stop Harming Monica
5

Jika Anda ingin melakukannya dengan cepat, saya sarankan menggunakan 'pigz' (yang IIRC singkatan dari "Implementasi Paralel GZip"). Saya baru saja mengalami situasi yang sama di mana saya ingin menghitung jumlah baris dalam banyak file yang di-gzip dan inilah solusi saya:

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

Yang memberi saya jumlah baris dan file itu dihitung dari pada baris bergantian, menggunakan 8 prosesor. Itu berlari dengan cepat!

Peter
sumber
1
Atau jika unpigz tidak tersedia, cukup denganfor x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Calimo
2

Gunakan perintah ini:

gzgrep -c $ filename.gz

Perintah gzgrepberperilaku sama seperti greptetapi pada file yang dikompresi gzip. Itu mendekompres file dengan cepat untuk pencocokan regex.

Dalam hal ini -cinstruksikan perintah untuk menampilkan jumlah baris yang cocok dan regex $cocok dengan akhir baris sehingga cocok dengan setiap baris atau file.

Hasil akhir identik dengan gzip -dc filename.gz | grep -c $.

Ravi KM
sumber
Apakah gzgreptersedia di sistem lain selain Solaris?
pabouk
1
Tidak. Pada sistem lain, perintahnya adalah zgrep -c $ filename.gz
Ravi KM
1
Meskipun secara intuitif orang mungkin berpikir ini lebih baik daripada zcat + wc, ketika saya menghitung waktu mereka, mereka mengambil jumlah waktu yang sama.
ngọcminh.oss
1

Jika Anda baik-baik saja dengan perkiraan kasar daripada hitungan yang tepat, dan benar-benar mengekstraksi seluruh file atau zgrepping untuk akhir baris akan memakan waktu terlalu lama (yang merupakan situasi saya sekarang), Anda dapat:

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

maka jumlah garis perkiraan adalah 1000 * (size of $file) / (size of 1000-line-sample), selama data Anda cukup homogen per baris.

James
sumber
0

gzip -cd <file.gz> | wc -l

Ini berhasil untuk saya.

prashanth
sumber