উত্তর:
নিম্নলিখিত কাজ করা উচিত:
$ 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/:/'
এখানে একই নীতির একটি পার্ল সমাধান রয়েছে। পার্ল অভ্যন্তরীণভাবে বাছাই করতে সক্ষম হওয়ার সুবিধা রয়েছে। এছাড়াও যদি ফাইলটি একটি নতুন লাইনের অক্ষরে শেষ না হয় তবে এটি সঠিকভাবে একটি অতিরিক্ত নিউলাইন গণনা করবে না।
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