একটি ফাইলের মোট শব্দ সংখ্যা কীভাবে গণনা করবেন?


18

আমি একটি ফাইলের সমস্ত শব্দের সংখ্যা গণনা করার জন্য একটি কমান্ড সন্ধান করছি। উদাহরণস্বরূপ যদি কোনও ফাইল এর মতো হয়,

today is a 
good day

তারপরে এটি মুদ্রণ করা উচিত 5, যেহেতু সেখানে 5শব্দ রয়েছে।


7
আপনি চেষ্টা করেছেন wc -w $FILE?
don_crissti

উত্তর:


39

কমান্ড 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

1
লক্ষ্য করুন কথাগুলো জন্য wc -wগনুহ জন্য হিসাবে একই সংজ্ঞা নেই grep -w। জন্য wcএকটি শব্দ এক বা একাধিক অ-স্পেস বর্ণের একটি ক্রম (হয় [:space:]বর্তমান লোকেলে চরিত্র শ্রেণী)। উদাহরণ হিসেবে বলা যায় foo,barএবং foo bar(ক অ ভঙ্গ স্থান সহ) প্রতিটি এক শব্দ।
স্টাফেন চেজেলাস

7

আমি জাস্ট নম্বরটির জন্য এটি নিয়ে এসেছি:

wc -w [file] | cut -d' ' -f1

5

আমি wc -w < [file]পদ্ধতির পছন্দ

অবশেষে, কেবল একটি ভেরিয়েবলে গণনা শব্দটি সংরক্ষণ করার জন্য আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

myVar=($(wc -w /path/to/file))

এটি আপনাকে ফাইলের নাম মার্জিতভাবে এড়িয়ে যেতে দেয়।


14
wc -w < "$file"শুধু সংখ্যা জন্য।
স্টাফেন চেজেলাস

3

পার্ল ব্যবহার করে আরও ভাল সমাধান:

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


13
এটি WC এর চেয়ে ভাল কেন?
স্পার

2
@ স্পার একটি জিনিসের জন্য কারণ আমার খুব আশ্চর্যের কাছে মনে হয় এটি অনেক দ্রুত। আমি এটি 141813504 শব্দ সহ একটি টেক্সট ফাইলে চেষ্টা করেছি এবং wcপার্ল ~ 5 সেক নিয়েছিলাম যখন sec 14 সেকেন্ড নিয়েছি!
টেরডন

3
আমি মনে করি 'বড়' ইস্যুটি সত্যই এমন একটি উত্তর যা পার্লের উপর নির্ভরশীলতা এবং আমি কখনই এরকম নির্ভরতার বড় অনুরাগী নই। যদি প্রশ্নটি পারফরম্যান্সের বিষয়ে ছিল তবে তা অন্য জিনিস হবে।
মাইকেল ডুরান্ট

5
লক্ষ্য করুন একটি splitউপর /\s+/একটি মত হল split(' ')ব্যতীত যে কোনো নেতৃস্থানীয় হোয়াইটস্পেস একটি নাল প্রথম ক্ষেত্র তৈরি করে। এই পার্থক্যটি আপনাকে প্রতি লাইন লিঙ্কে একটি অতিরিক্ত শব্দ (নাল প্রথম ক্ষেত্র, এটি) দেবে । সুতরাং এটি (split(" ", $_))তৈরির জন্য একটি ফাইলের জন্য অন্যথায় ব্যবহার করুন: echo -e "unix\n linux" > testfileআপনার ওয়ান-লাইনার 3 টি শব্দের প্রতিবেদন করে।
don_crissti

1
আপনার সময়গুলি দেখায় যে ডাব্লুসিটি দ্রুত হয় (এটি ব্যবহারকারীর এবং সেখানে গুরুত্বপূর্ণ বিষয়গুলি বোঝায়)। এলসি_এলএল = সি সহ, wcউল্লেখযোগ্যভাবে দ্রুত হবে, ঠিক তেমনি PERLIO=:utf8, perlধীরে ধীরে ধীরে ধীরে হবে।
স্টাফেন চেজেলাস

3

আসুন আমরা ব্যবহার করি!

$ 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

এমনকি আমার .ডটফাইলে এই ফাংশনটি যুক্ত করেছি


সূত্র: এডাব্লুকে-ওয়ার্ড রুবি


এটি শব্দকে গণনা করে, তাই এটি আমার পক্ষে যথেষ্ট ভাল! :-)
অ্যাগসোল

3

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

তুলনা গণনা:

  • নিজে স্ক্রিপ্ট চালানো, আমাকে 76 টি শব্দ দেয়।
  • @ কুওলম দ্বারা পার্লের উদাহরণটি 31 দেয়।
  • ব্যবহার wc28 দেয়।

রেফারেন্সের জন্য, পসিক্স ভিআই বলেছেন:

পসিক্স লোকালে, vi পাঁচটি শব্দকে স্বীকৃতি দেবে:

  1. উভয় প্রান্তে সীমিত করে বর্ণ, অঙ্ক এবং আন্ডারস্কোরগুলির সর্বাধিক ক্রম:

    • অক্ষর, অঙ্ক বা আন্ডারস্কোর ব্যতীত অন্য অক্ষর

    • একটি লাইনের শুরু বা শেষ end

    • সম্পাদনা বাফারের শুরু বা শেষ

  2. অক্ষর, অঙ্ক, আন্ডারস্কোর বা অক্ষর ব্যতীত অন্য অক্ষরের সর্বাধিক ক্রম, উভয় প্রান্তে সীমানা দ্বারা:

    • একটি চিঠি, অঙ্ক, আন্ডারস্কোর
    • <blank> চরিত্র
    • একটি লাইনের শুরু বা শেষ end
    • সম্পাদনা বাফারের শুরু বা শেষ
  3. এক বা একাধিক ক্রমযুক্ত ফাঁকা রেখা

  4. সম্পাদনা বাফারের প্রথম অক্ষর

  5. <newline>সম্পাদনা বাফারে সর্বশেষ নন

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