আমি কীভাবে কোনও ফাইলের বিভিন্ন অক্ষরের সংখ্যা গণনা করতে পারি?


19

আমার একটি প্রোগ্রাম দরকার যা একটি ফাইলের বিভিন্ন বর্ণের সংখ্যাকে আউটপুট করে। উদাহরণ:

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

কোন হাতিয়ার বিদ্যমান, এটি কি?

উত্তর:


21

নিম্নলিখিত কাজ করা উচিত:

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

প্রথমত, আমরা প্রতিটি অক্ষরকে তার নিজস্ব লাইনে রেখে প্রতিটি চরিত্রের পরে একটি নতুন লাইন সন্নিবেশ করি। তারপর আমরা এটি বাছাই। তারপরে আমরা ডুপ্লিকেটগুলি মুছে ফেলার জন্য ইউনিক কমান্ডটি ব্যবহার করি, প্রতিটি অক্ষরের অক্ষরের উপস্থিতিগুলির সংখ্যার সাথে উপসর্গ করে।

ফ্রিকোয়েন্সি অনুসারে তালিকাটি বাছাই করতে, এগুলিতে পাইপ দিন sort -nr


4
ম্যাক ওএস এক্সের জন্য এটি এটিsed 's/\(.\)/\1\'$'\n/g' text.txt
এমবি

খুব সুন্দর, তবে দুর্ভাগ্যক্রমে এটি সঠিকভাবে কাজ করে না যদি পাঠ্যে ইউনিকোড (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/:/'

এখানে একই নীতির একটি পার্ল সমাধান রয়েছে। পার্ল অভ্যন্তরীণভাবে বাছাই করতে সক্ষম হওয়ার সুবিধা রয়েছে। এছাড়াও যদি ফাইলটি একটি নতুন লাইনের অক্ষরে শেষ না হয় তবে এটি সঠিকভাবে একটি অতিরিক্ত নিউলাইন গণনা করবে না।

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.