मैं एक फ़ाइल में विभिन्न वर्णों की संख्या कैसे गिन सकता हूं?


19

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

> stats testfile
' ': 207
'e': 186
'n': 102

किसी भी उपकरण से बाहर निकलता है, कि ऐसा करते हैं?

जवाबों:


21

निम्नलिखित काम करना चाहिए:

$ sed 's/\(.\)/\1\n/g' text.txt | sort | uniq -c

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

आवृत्ति द्वारा सूची को सॉर्ट करने के लिए, इस सभी को पाइप में डालें sort -nr


4
मैक ओएस एक्स के लिए sed परsed 's/\(.\)/\1\'$'\n/g' text.txt
mb21

बहुत अच्छा है, लेकिन दुर्भाग्य से यह सही ढंग से काम नहीं करता है यदि पाठ में यूनिकोड (utf8) अक्षर हैं। ऐसा करने का एक तरीका हो सकता है sed, लेकिन जैकब व्लिजम के पायथन समाधान ने मेरे लिए अच्छा काम किया।
बिटिनर

14

स्टीवन का समाधान एक अच्छा, सरल है। यह बहुत बड़ी फ़ाइलों (फ़ाइलों के बारे में जो आपके आधे रैम में आराम से फिट नहीं होती हैं) के लिए बहुत अच्छा नहीं है। यहाँ एक अजीब संस्करण है। यह जटिल है क्योंकि यह कुछ विशेष वर्ण के लिए सही काम करने की कोशिश करता थोड़ा और भी है (नई-पंक्तियों, ', \, :)।

awk '
  {for (i=1; i<=length; i++) ++c[substr($0,i,1)]; ++c[RS]}
  function chr (x) {return x=="\n" ? "\\n" : x==":" ? "\\072" :
                           x=="\\" || x=="'\''" ? "\\" x : x}
  END {for (x in c) printf "'\''%s'\'': %d\n", chr(x), c[x]}
' | sort -t : -k 2 -r | sed 's/\\072/:/'

यहाँ एक ही सिद्धांत पर एक पर्ल समाधान है। आंतरिक रूप से छांटने में सक्षम होने का फायदा पर्ल को है। इसके अलावा यह सही ढंग से एक अतिरिक्त newline की गणना नहीं करेगा यदि फ़ाइल एक newline वर्ण में समाप्त नहीं होती है।

perl -ne '
  ++$c{$_} foreach split //;
  END { printf "'\''%s'\'': %d\n", /[\\'\'']/ ? "\\$_" : /./ ? $_ : "\\n", $c{$_}
        foreach (sort {$c{$b} <=> $c{$a}} keys %c) }'

1
+1 उस भयानक प्रकार को न करने के लिए
स्पर्स

1

माणिक का उपयोग करते हुए एक धीमी लेकिन अपेक्षाकृत स्मृति के अनुकूल संस्करण। इनपुट आकार की परवाह किए बिना, लगभग एक दर्जन एमबी रैम।

# count.rb
ARGF.
  each_char.
  each_with_object({}) {|e,a| a[e] ||= 0; a[e] += 1}.
  each {|i| puts i.join("\t")}

ruby count.rb < input.txt
t       20721
d       20628
S       20844
k       20930
h       20783
... etc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.