đếm số dòng trong một tệp nén


Câu trả lời:


61

Bạn rõ ràng không thể đếm dòng mới nếu tập tin vẫn được nén.

Nhưng bạn có thể giải nén một luồng và đếm các dòng mới trong luồng đó mà không bao giờ ghi tệp (giải nén) vào đĩa. Điều đó sẽ đi một cái gì đó như vậy:

zcat file.gz | wc -l

zcat cho giải nén & cat, wc cho wordcount. Xem trang người đàn ông cho cả hai nếu bạn muốn biết thêm.

CHỈNH SỬA

Nếu bạn không có zcat, zcat chỉ là một tên khác cho gunzip -c.


7
Trên Unices gziplà nơi khác biệt compress, bạn muốn gzcat.
coneslayer

7

Điều này dường như cũng hoạt động - grep cho số lượng kết thúc dòng trong tệp

zgrep -Ec "$" file.gz

Điều này mang lại cho tôi một câu trả lời khác (cao hơn nhiều) so với đường ống đếnwc -l
Ngừng làm hại Monica

5

Nếu bạn muốn thực hiện nhanh chóng, tôi khuyên bạn nên sử dụng 'pigz' (mà IIRC là viết tắt của "Thực hiện song song GZip"). Tôi chỉ gặp một tình huống tương tự khi tôi muốn đếm số lượng dòng trong một loạt các tệp được nén và đây là giải pháp của tôi:

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

Nó cho tôi số lượng dòng và tập tin được tính từ các dòng xen kẽ, sử dụng 8 bộ xử lý. Nó chạy thật nhanh!


1
Hoặc nếu unpigz không có sẵn, chỉ cần vớifor x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Calimo

2

Sử dụng lệnh này:

gzgrep -c $ filename.gz

Lệnh này gzgrephoạt động giống như grepnhưng trên các tệp nén gzip. Nó giải nén tập tin một cách nhanh chóng để khớp regex.

Trong trường hợp này, -chướng dẫn lệnh xuất số dòng phù hợp và biểu thức chính quy $khớp với cuối dòng để phù hợp với mọi dòng hoặc tệp.

Kết quả cuối cùng là giống hệt gzip -dc filename.gz | grep -c $.


gzgrepsẵn trên các hệ thống khác ngoài Solaris?
pabouk

1
Không. Trên các hệ thống khác, lệnh sẽ là zgrep -c $ filename.gz
Ravi KM

1
Mặc dù người ta có thể nghĩ rằng điều này tốt hơn zcat + wc, nhưng khi tôi dành thời gian cho họ, họ mất cùng một khoảng thời gian.
Mâyminh.oss

1

Nếu bạn ổn với ước tính sơ bộ thay vì đếm chính xác và thực sự trích xuất toàn bộ tệp hoặc sắp xếp nó để kết thúc dòng sẽ mất quá nhiều thời gian (đó là tình huống của tôi lúc này), bạn có thể:

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

sau đó, số lượng dòng gần đúng là 1000 * (size of $file) / (size of 1000-line-sample), miễn là dữ liệu của bạn khá đồng nhất trên mỗi dòng.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.