एक संपीड़ित फ़ाइल में लाइनें गिनें


42

अगर मेरे पास यूजी पर एक .gz फाइल है जिसमें कुछ निश्चित पंक्तियां हैं। मैं बिना किसी को बताए यूनिक्स पर लाइनों को कैसे गिन सकता हूं।


संग्रह को निकाले बिना आप लाइनों की गणना नहीं कर सकते।
zoli2k

जवाबों:


60

यदि फ़ाइल अभी भी संपीड़ित है, तो आप स्पष्ट रूप से नई गणना नहीं कर सकते।

लेकिन आप एक स्ट्रीम को डिकम्प्रेस कर सकते हैं, और उस स्ट्रीम में न्यूलाइन्स को गिन सकते हैं, बिना डिस्क को कभी भी विघटित (डिकम्प्रेस्ड) फाइल लिखे बिना। ऐसा कुछ होगा:

zcat file.gz | wc -l

Zomat के लिए decompress & cat, wc के लिए wordcount। यदि आप अधिक जानना चाहते हैं तो दोनों के लिए मैन पेज देखें।

संपादित करें

यदि आपके पास zcat नहीं है, तो zcat केवल एक और नाम है gunzip -c


7
उन यूनियनों पर जहां gzipसे अलग है compress, आप चाहते हैं gzcat
कोन्सलेयर


5

यदि आप इसे जल्दी से करना चाहते हैं, तो मैं 'पिगज़' का उपयोग करने की सलाह देता हूं (जो IIRC "GZip के समानांतर कार्यान्वयन" के लिए है)। मेरे पास एक ऐसी ही स्थिति थी जहां मैं गज़िप की फाइलों के एक समूह में लाइनों की संख्या गिनना चाहता था और यहां मेरा समाधान था:

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

जिसने मुझे 8 प्रोसेसर का उपयोग करके लाइनों की संख्या और वैकल्पिक लाइनों पर गिने जाने वाली फ़ाइल दी। यह जल्दी से चला गया!


1
या यदि अप्रकाश उपलब्ध नहीं है, तो बस के साथfor x in *.fastq.gz; do zcat "$x" | wc -l && echo $x; done
कैलिमो

2

इस कमांड का उपयोग करें:

gzgrep -c $ filename.gz

आदेश gzgrepवही व्यवहार करता है grepलेकिन gzip संपीड़ित फ़ाइलों पर। यह रेगेक्स मिलान के लिए फ़्लाई पर फ़ाइल को डिकम्प्रेस करता है।

इस मामले -cमें कमांड को मेल की गई लाइनों की आउटपुट संख्या और रेगेक्स $लाइन के अंत से मेल खाने का निर्देश देती है, इसलिए यह हर लाइन या फाइल से मेल खाती है।

अंतिम परिणाम के समान है gzip -dc filename.gz | grep -c $


क्या gzgrepसोलारिस के अलावा अन्य प्रणालियों पर उपलब्ध है?
पाबौक

1
सं। अन्य प्रणालियों पर, कमांड zgrep -c $ filename.gz होगा
रवि 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), जब तक कि आपका डेटा प्रति लाइन काफी सजातीय हो।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.