किसी फ़ाइल में फ़ील्ड के भिन्न मानों की गणना करें


17

मेरे पास एक फाइल है जिसमें लगभग लाखों की संख्या में लाइनें हैं। लाइनों में मेरे पास एक फ़ील्ड है transactionid, जिसमें दोहराए गए मान हैं। मुझे जो करने की जरूरत है, वह है उन्हें विशिष्ट रूप से गिनना।

कोई भी मूल्य कितनी बार दोहराया जाए, यह केवल एक बार ही गिना जाना चाहिए।


यह अधिक आसान होगा, यदि आप केवल फ़ाइल के प्रारूप की एक झलक दे सकते हैं.. जरूरी डेटा नहीं।
बजे निखिल मुल्ले

btw, क्या आप चाहते हैं कि मान को 1 की परवाह किए बिना माना जाए कि यह कितनी बार मौजूद है, या आप घटनाओं / दोहराव की संख्या की गिनती चाहते हैं? यदि आप चाहते हैं कि इसे एक बार गिना जाए, तो अलग-अलग मूल्य कैसे गिने जाते हैं? क्या आप अपने प्रश्न पर मेरे संपादन की जाँच कर सकते हैं और पुष्टि कर सकते हैं कि क्या मैं व्याख्या करने में सही हूँ।
निखिल मुल्ले

@ निखिल इस सवाल से स्पष्ट है:... No matter of how many times a value is repeated, it should be counted as 1. ...

ठीक है, तो @ हेज़ से जवाब आपकी ज़रूरत को पूरा करेगा।
निखिल मुल्ले

विलंबता के लिए खेद है। मैं इंटरनेट कनेक्शन से बाहर था। सेपरेटर 2 है। ' और फ़ील्ड फ़ील्ड 28 है। मैंने उपयोग किया; cat <file_name> | awk -F"|" '{if ((substr($2,0,8)=='20120110')) print $28}' | sort -u | wc -l अगर क्लॉज़ डेट की एक और जाँच के लिए था जैसा कि स्पष्ट लगता है :)
ओलगुन काया

जवाबों:


23

ठीक है, मान लें कि आपकी फ़ाइल एक पाठ फ़ाइल है, अल्पविराम विभाजक द्वारा अलग किए गए फ़ील्ड ','। आपको यह भी पता होगा कि 'transactionid'इसकी स्थिति के संदर्भ में कौन सा क्षेत्र है। यह मानते हुए कि आपका 'transactionid'क्षेत्र 7 वां क्षेत्र है।

awk -F ',' '{print $7}' text_file | sort | uniq -c

यह 7 वें क्षेत्र में विशिष्ट / अद्वितीय घटनाओं की गणना करेगा और परिणाम को प्रिंट करेगा।


आज्ञा sortसे पहले क्यों uniq
g10guang

@ g10guang uniqरिकॉर्ड्स को समाप्त करने के लिए वे एक-दूसरे के बगल में होना चाहते हैं।
dsz

3

शायद सबसे चिकना तरीका नहीं है, लेकिन यह काम करना चाहिए:

awk '{print $1}' your_file | sort | uniq | wc -l

जहां $1क्षेत्र को पार्स किए जाने की संख्या है।


3

फ़ाइल को सॉर्ट करने की कोई आवश्यकता नहीं है .. ( uniqफ़ाइल को सॉर्ट करने की आवश्यकता है)
यह awk स्क्रिप्ट मानता है कि फ़ील्ड पहले व्हाट्सएप डेलिमेटेड फ़ील्ड है।

awk 'a[$1] == "" { a[$1]="X" } END { print length(a) }' file 

एक बड़ी फ़ाइल के लिए (जैसा कि, RAM के आकार के करीब हो रहा है), awk बहुत मेमोरी की खपत करेगा। अधिकांश sortकार्यान्वयन बड़ी फ़ाइलों के साथ अच्छी तरह से सामना करने के लिए डिज़ाइन किए गए हैं।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.