আমি একটি ফাইলের সমস্ত শব্দের সংখ্যা গণনা করার জন্য একটি কমান্ড সন্ধান করছি। উদাহরণস্বরূপ যদি কোনও ফাইল এর মতো হয়,
today is a
good day
তারপরে এটি মুদ্রণ করা উচিত 5
, যেহেতু সেখানে 5
শব্দ রয়েছে।
আমি একটি ফাইলের সমস্ত শব্দের সংখ্যা গণনা করার জন্য একটি কমান্ড সন্ধান করছি। উদাহরণস্বরূপ যদি কোনও ফাইল এর মতো হয়,
today is a
good day
তারপরে এটি মুদ্রণ করা উচিত 5
, যেহেতু সেখানে 5
শব্দ রয়েছে।
উত্তর:
কমান্ড wc
ওরফে। শব্দ গণনা এটি করতে পারে:
$ wc -w <file>
$ cat sample.txt
today is a
good day
$ wc -w sample.txt
5 sample.txt
# just the number (thanks to Stephane Chazelas' comment)
$ wc -w < sample.txt
5
wc -w
গনুহ জন্য হিসাবে একই সংজ্ঞা নেই grep -w
। জন্য wc
একটি শব্দ এক বা একাধিক অ-স্পেস বর্ণের একটি ক্রম (হয় [:space:]
বর্তমান লোকেলে চরিত্র শ্রেণী)। উদাহরণ হিসেবে বলা যায় foo,bar
এবং foo bar
(ক অ ভঙ্গ স্থান সহ) প্রতিটি এক শব্দ।
আমি জাস্ট নম্বরটির জন্য এটি নিয়ে এসেছি:
wc -w [file] | cut -d' ' -f1
5
আমি wc -w < [file]
পদ্ধতির পছন্দ
অবশেষে, কেবল একটি ভেরিয়েবলে গণনা শব্দটি সংরক্ষণ করার জন্য আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:
myVar=($(wc -w /path/to/file))
এটি আপনাকে ফাইলের নাম মার্জিতভাবে এড়িয়ে যেতে দেয়।
wc -w < "$file"
শুধু সংখ্যা জন্য।
পার্ল ব্যবহার করে আরও ভাল সমাধান:
perl -nle '$word += scalar(split(/\s+/, $_)); END{print $word}' filename
@Bernhard
আপনি wc
কোর্টিলস থেকে কমান্ডের কোডের কোডটি পরীক্ষা করতে পারেন , আমি আমার মেশিনে পরীক্ষা করি, ফাইলটি subst.c
বাশ ৪.২ উত্স সহ।
time wc -w subst.c
real 0m0.025s
user 0m0.016s
sys 0m0.000s
এবং
time perl -nle '$word += scalar(split(" ", $_)); END{print $word}' subst.c
real 0m0.021s
user 0m0.016s
sys 0m0.004s
ফাইলটি যত বড়, পার্ল ততই দক্ষ wc
।
wc
পার্ল ~ 5 সেক নিয়েছিলাম যখন sec 14 সেকেন্ড নিয়েছি!
split
উপর /\s+/
একটি মত হল split(' ')
ব্যতীত যে কোনো নেতৃস্থানীয় হোয়াইটস্পেস একটি নাল প্রথম ক্ষেত্র তৈরি করে। এই পার্থক্যটি আপনাকে প্রতি লাইন লিঙ্কে একটি অতিরিক্ত শব্দ (নাল প্রথম ক্ষেত্র, এটি) দেবে । সুতরাং এটি (split(" ", $_))
তৈরির জন্য একটি ফাইলের জন্য অন্যথায় ব্যবহার করুন: echo -e "unix\n linux" > testfile
আপনার ওয়ান-লাইনার 3 টি শব্দের প্রতিবেদন করে।
wc
উল্লেখযোগ্যভাবে দ্রুত হবে, ঠিক তেমনি PERLIO=:utf8
, perl
ধীরে ধীরে ধীরে ধীরে হবে।
$ function wordfrequency() { awk 'BEGIN { FS="[^a-zA-Z]+" } { for (i=1; i<=NF; i++) { word = tolower($i) words[word]++ } } END { for (w in words) printf("%3d %s\n", words[w], w) } ' | sort -rn }
$ cat your_file.txt | wordfrequency
এটি প্রদত্ত ফাইলে সংঘটিত প্রতিটি শব্দের ফ্রিকোয়েন্সি তালিকাভুক্ত করে। আমি জানি আপনি যা চেয়েছিলেন তা নয়, তবে এটি আরও ভাল! আপনি যদি আপনার শব্দের উপস্থিতি দেখতে চান তবে আপনি কেবল এটি করতে পারেন:
$ cat your_file.txt | wordfrequency | grep yourword
এমনকি আমার .ডটফাইলে এই ফাংশনটি যুক্ত করেছি
সূত্র: এডাব্লুকে-ওয়ার্ড রুবি
wc
প্রোগ্রাম গন্য "শব্দ", কিন্তু ঐ উদাহরণস্বরূপ "শব্দ" যে অনেক মানুষ যখন তারা একটি ফাইল পরীক্ষা দেখতে হবে না। vi
উদাহরণস্বরূপ প্রোগ্রাম, "শব্দ" একটি ভিন্ন পরিমাপ, তাদের চরিত্র শ্রেণীর উপর ভিত্তি করে delimiting ব্যবহার করার সময় wc
কেবল বড়, মোট ছাত্র জিনিষ হোয়াইটস্পেস দ্বারা পৃথক । দুটি পদক্ষেপ মূলত পৃথক হতে পারে। এই উদাহরণ বিবেচনা করুন:
first,second
vi
দেখেন তিন শব্দ ( প্রথম এবং দ্বিতীয় সেইসাথে কমা তাদের পৃথক), যখন wc
দেখেন এক (যে লাইনে কোন হোয়াইটস্পেস যায়)। শব্দ গণনা করার অনেকগুলি উপায় রয়েছে, কিছু অন্যের চেয়ে কম কাজে লাগে।
পার্ল ভাল ষষ্ঠ-শৈলী শব্দের জন্য একটি পাল্টা লেখা উপযুক্ত হবে, তখন এখানে একটি দ্রুত উদাহরণ ব্যবহার করছে sed
, tr
এবং wc
(আক্ষরিক ঘোড়ার গাড়ি ব্যবহার আয় পরিমিতরূপে পোর্টেবল ^M
):
#!/bin/sh
in_words="[[:alnum:]_]"
in_punct="[][{}\\|:\"';<>,./?\`~!@#$%^&*()+=-]"
sed -e "s/\($in_words\)\($in_punct\)/\1^M\2/g" \
-e "s/\($in_punct\)\($in_words\)/\1^M\2/g" \
-e "s/[[:space:]]/^M/g" \
"$@" |
tr '\r' '\n' |
sed -e '/^$/d' |
wc -l
তুলনা গণনা:
wc
28 দেয়।রেফারেন্সের জন্য, পসিক্স ভিআই বলেছেন:
পসিক্স লোকালে, vi পাঁচটি শব্দকে স্বীকৃতি দেবে:
উভয় প্রান্তে সীমিত করে বর্ণ, অঙ্ক এবং আন্ডারস্কোরগুলির সর্বাধিক ক্রম:
অক্ষর, অঙ্ক বা আন্ডারস্কোর ব্যতীত অন্য অক্ষর
একটি লাইনের শুরু বা শেষ end
সম্পাদনা বাফারের শুরু বা শেষ
অক্ষর, অঙ্ক, আন্ডারস্কোর বা অক্ষর ব্যতীত অন্য অক্ষরের সর্বাধিক ক্রম, উভয় প্রান্তে সীমানা দ্বারা:
- একটি চিঠি, অঙ্ক, আন্ডারস্কোর
<blank>
চরিত্র- একটি লাইনের শুরু বা শেষ end
- সম্পাদনা বাফারের শুরু বা শেষ
এক বা একাধিক ক্রমযুক্ত ফাঁকা রেখা
সম্পাদনা বাফারের প্রথম অক্ষর
<newline>
সম্পাদনা বাফারে সর্বশেষ নন
wc -w $FILE
?