जवाबों:
निम्नलिखित काम करना चाहिए:
$ sed 's/\(.\)/\1\n/g' text.txt | sort | uniq -c
सबसे पहले, हम हर वर्ण के बाद एक नई पंक्ति सम्मिलित करते हैं, प्रत्येक वर्ण को अपनी पंक्ति में रखते हैं। फिर हम इसे क्रमबद्ध करते हैं। फिर हम डुप्लिकेट को हटाने के लिए यूनीक कमांड का उपयोग करते हैं, प्रत्येक लाइन को उस कैरेक्टर के होने की संख्या के साथ प्रीफ़िक्स करते हैं।
आवृत्ति द्वारा सूची को सॉर्ट करने के लिए, इस सभी को पाइप में डालें sort -nr
।
sed
, लेकिन जैकब व्लिजम के पायथन समाधान ने मेरे लिए अच्छा काम किया।
स्टीवन का समाधान एक अच्छा, सरल है। यह बहुत बड़ी फ़ाइलों (फ़ाइलों के बारे में जो आपके आधे रैम में आराम से फिट नहीं होती हैं) के लिए बहुत अच्छा नहीं है। यहाँ एक अजीब संस्करण है। यह जटिल है क्योंकि यह कुछ विशेष वर्ण के लिए सही काम करने की कोशिश करता थोड़ा और भी है (नई-पंक्तियों, '
, \
, :
)।
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) }'
माणिक का उपयोग करते हुए एक धीमी लेकिन अपेक्षाकृत स्मृति के अनुकूल संस्करण। इनपुट आकार की परवाह किए बिना, लगभग एक दर्जन एमबी रैम।
# 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
sed 's/\(.\)/\1\'$'\n/g' text.txt