nếu tôi có tệp .gz trên unix có số dòng nhất định. Làm thế nào tôi có thể đếm các dòng trên unix mà không giải nén nó.
nếu tôi có tệp .gz trên unix có số dòng nhất định. Làm thế nào tôi có thể đếm các dòng trên unix mà không giải nén nó.
Câu trả lời:
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
.
gzip
là nơi khác biệt compress
, bạn muốn gzcat
.
Đ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
wc -l
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!
for x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
Sử dụng lệnh này:
gzgrep -c $ filename.gz
Lệnh này gzgrep
hoạt động giống như grep
như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, -c
hướ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 $
.
gzgrep
sẵn trên các hệ thống khác ngoài Solaris?
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.