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


43

আমার কাছে একটি বড় জেএসওএন ফাইল রয়েছে যা এক লাইনে রয়েছে এবং আমি ফাইলটিতে একটি শব্দের সংখ্যার সংখ্যা গণনা করতে সক্ষম হতে কমান্ড লাইনটি ব্যবহার করতে চাই। আমি এটা কিভাবে করবো?


শব্দটি JSON ডেটার উভয় কী এবং মানগুলিতে মিলিত হওয়া উচিত কিনা তা স্পষ্ট নয়, অর্থাত একবারে বা দু'বার { "key": "the key" }স্ট্রিংটি গণনা করা উচিত key
কুসালানন্দ

উত্তর:


45
$ tr ' ' '\n' < FILE | grep WORD | wc -l

যেখানে trনিউলাইনগুলির সাথে স্পেসগুলি প্রতিস্থাপন করে, ডাব্লুএআরডির সাথে grepমেলে সমস্ত ফলাফল লাইনগুলি ফিল্টার করে এবং wcবাকিগুলি গণনা করে।

এমনকি গ্রেপ বিকল্পটি wcব্যবহার করে কেউ অংশটি সংরক্ষণ করতে পারে -c:

$ tr ' ' '\n' < FILE | grep -c WORD

-cবিকল্প POSIX দ্বারা সংজ্ঞায়িত করা হয়।

শব্দের মধ্যে শূন্যস্থান রয়েছে কিনা তা যদি নিশ্চিত না হয় তবে প্রতিস্থাপনের জন্য আপনাকে অন্য কিছু চরিত্র (ডিলিমিটার হিসাবে) ব্যবহার করতে হবে। উদাহরণস্বরূপ বিকল্প trঅংশগুলি হ'ল

tr '"' '\n'

অথবা

tr "'" '\n'

আপনি যদি ডাবল বা একক উদ্ধৃতি প্রতিস্থাপন করতে চান। অবশ্যই, আপনি trএকবারে একাধিক অক্ষর প্রতিস্থাপন করতেও ব্যবহার করতে পারেন (বিভিন্ন ধরণের শ্বেতস্থান এবং বিরামচিহ্নগুলি ভাবেন)।

আপনার যদি WORD গণনা করতে হবে তবে উপসর্গ, WORDsuffix বা উপসর্গ WORDsuffix না গণনা করা দরকার, আপনি শুরু / শেষ-অব-লাইন চিহ্নিতকারীগুলিতে WORD প্যাটার্নটি আবদ্ধ করতে পারেন:

grep -c '^WORD$'

যা আমাদের প্রসঙ্গে শব্দ-শুরু / শেষ চিহ্নগুলির সমতুল্য:

grep -c '\<WORD\>'

যদি কোনও শূন্যস্থান না থাকে, অর্থাত্ ক্ষেত্রের নামটি চারপাশে উদ্ধৃত হয়? উদাহরণস্বরূপ "ক্ষেত্র"
পুরাণ

@ মাইথজ: তারপরে আপনি কোটগুলি নতুনের সাথে টিআর দিয়ে প্রতিস্থাপন করুন। আমি উত্তর আপডেট করব।
maxschlepzig

1
এই উত্তরটি বিভিন্ন উপায়ে ভুল। এটি অস্পষ্ট: আপনি trকখনই কোনও কমান্ড নিয়ে আসতে পারেন যা কাজটি করে এমন উদাহরণগুলির পরিবর্তে সমস্ত পরিস্থিতিতে কখনই কাজ করবে না এমন পরামর্শ দেওয়ার পরিবর্তে কাজ করতে পারে। এটি এমন শব্দগুলির সাথেও মিলবে যাতে আপনি যে শব্দটি অনুসন্ধান করছেন তা অন্তর্ভুক্ত। grep -o '\<WORD\>' | wc -lসমাধান পর্যন্ত শ্রেয়।
সাম হোচেভার

1
@ স্যাম, প্রশ্নটি এটিকে একধরণের উন্মুক্ত রাখে, যদি কোনও অনুসন্ধানের শব্দটি 'ডাব্লুআরড' বা '\ <ওয়ার্ড searched>' এর মতো অনুসন্ধান করা উচিত - তবে আপনি এটি উভয় উপায়েই পড়তে পারেন। এমনকি যদি আপনি এটি ২ য় উপায়ে এবং কেবল ২ য় উপায়ে পড়ে থাকেন তবে আমার উত্তরটি কেবলমাত্র একভাবেই ভুল হবে। ;) এবং 'গ্রেপ-ও' সমাধানটি কেবল উচ্চতর হয়, যদি এটি -o বিকল্পটি সমর্থন করে - যা পসিক্স দ্বারা নির্দিষ্ট করা হয়নি ... ভাল, আমি মনে করি না যে ট্র এর ব্যবহার এটি কল করার জন্য বিদেশী অস্পষ্ট ...
ম্যাক্সচলেপজিগ

1
@ কুসালানন্দ, ঠিক আছে, এটি এখনও একটি ঘটনা। তবে আপনি যদি এই জাতীয় স্ট্রিং ম্যাচগুলি গণনা করতে না চান তবে দয়া করে আমার উত্তরের শেষ অনুচ্ছেদ এবং আমার পূর্ববর্তী মন্তব্যটি এখানে পড়ুন।
ম্যাক্সচলেপজিগ

24

জিএনইউ গ্রেপ সহ, এটি কাজ করে: grep -o '\<WORD\>' | wc -l

-o প্রতিটি লাইনের প্রতিটি মিলিত অংশগুলি আলাদা লাইনে মুদ্রণ করে।

\<একটি শব্দের শুরুতে দৃser়তা দেয় এবং একটি শব্দের \>শেষে (পার্লের অনুরূপ \b) জোর দেয় , সুতরাং এটি নিশ্চিত করে যে আপনি কোনও শব্দের মাঝখানে কোনও স্ট্রিংয়ের সাথে মেলে না।

উদাহরণ স্বরূপ,

$ পাইথন -c 'এই আমদানি' | গ্রেপ '\ <এক \>'
থাকা উচিত এক শুধুমাত্র এবং বিশেষ করে - এক এটা করতে --obvious উপায়।
নামস্থান হয় এক মহান ধারণা honking - এর ঐ আরও অনেক কিছু করা যাক!
$ পাইথন -c 'এই আমদানি' | grep -o '\ <one \>'
 এক 
এক 
এক 
$ পাইথন -c 'এটি আমদানি করুন' | গ্রেপ-ও '\ <এক \>' | wc -l
3

1
বা কেবলgrep -wo WORD | wc -l
স্টাফেন চেজেলাস

10

এই দুর্ভাগ্যবশত কাজ করে না গনুহ সঙ্গে coreutils

grep -o -c WORD file

যদি এটি আপনার প্ল্যাটফর্মে কাজ করে তবে এটি একটি মার্জিত এবং মোটামুটি স্বজ্ঞাত সমাধান; তবে জিএনইউর লোকেরা এখনও ভাবছে।


2
আমার খারাপ,
ত্রুটিটি

1
খুব খারাপ এটি সবচেয়ে মার্জিত
হত

এটি আমার পক্ষে কাজ করেছিল!
থারুজি

এটা ভুল. এটি প্যাটার্ন WORD এর সাথে রেখার সংখ্যা গণনা করে। ওপি ঘটনাগুলির মোট সংখ্যা চায় wants
পিয়েরে বি

@ পিয়েরিবি এজন্যই আমি বলছি জিএনইউতে grepএখানে একটি বাগ রয়েছে। এটি পোজিক্স থেকে পরিষ্কার নয় যে সংমিশ্রণের শব্দার্থকগুলি কী -cএবং -oএটি বর্তমানে বহনযোগ্য নয়। মন্তব্যের জন্য ধন্যবাদ; আমি এই উত্তর আপডেট করেছি।
ট্রিপলি

7
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl 

এই আদেশটি নিম্নলিখিতগুলি করে:

  1. সমস্ত ফাঁকা স্থানের সাথে অক্ষরবিহীন অক্ষরকে প্রতিস্থাপন করুন।
  2. সমস্ত লাইন বিরতি স্পেসে রূপান্তরিত হয়।
  3. সমস্ত একাধিক ফাঁকা স্থানকে একটি ফাঁকা জায়গায় হ্রাস করে
  4. সমস্ত স্পেস এখন লাইন ব্রেকগুলিতে রূপান্তরিত হয়েছে। প্রতিটি শব্দ একটি লাইনে।
  5. 'হ্যালো' এবং 'হ্যালো' আলাদা শব্দ হতে এড়াতে সমস্ত শব্দকে ছোট হাতের অক্ষরে অনুবাদ করে
  6. পাঠ্য সাজান
  7. সমান লাইন গণনা এবং অপসারণ
  8. সর্বাধিক ঘন শব্দগুলি গণনা করতে বিপরীতে সাজান
  9. পুরো শব্দটি ফোটোসটি জানতে প্রতিটি শব্দের একটি লাইন নম্বর যুক্ত করুন

উদাহরণস্বরূপ যদি আমি প্রথম লিনাস টরভাল্ড বার্তাটিকে বিশ্লেষণ করতে চাই:

থেকে: torvalds@klaava.Helsinki.FI (লিনাস বেনেডিক্ট টরভাল্ডস) নিউজগ্রুপস: কমপোস.মিনিক্স বিষয়: আপনি মিনিক্সে সর্বাধিক কী দেখতে চান? সংক্ষিপ্তসার: আমার নতুন অপারেটিং সিস্টেমের জন্য ছোট পোল বার্তা-আইডি: <1991Aug25.205708.9541@klaava.Helsinki.FI> তারিখ: 25 আগস্ট 91 20:57:08 জিএমটি সংস্থা: হেলসিঙ্কি বিশ্ববিদ্যালয়

মিনিক্স ব্যবহার করে ওখানকার সবাইকে হ্যালো -

আমি 386 (486) এটি ক্লোনগুলির জন্য একটি (ফ্রি) অপারেটিং সিস্টেম (কেবল একটি শখ, Gnu এর মতো বড় এবং পেশাদার হবে না) করছি। এটি এপ্রিল মাস থেকে তৈরি হচ্ছে, এবং প্রস্তুত হতে শুরু করে। মিনিক্সে পছন্দ / অপছন্দ করা লোকগুলির বিষয়ে আমি কোনও প্রতিক্রিয়া চাই, যেহেতু আমার ওএস এটি কিছুটা সাদৃশ্যযুক্ত (ফাইল-সিস্টেমের একই শারীরিক বিন্যাস (অন্যান্য কারণগুলির মধ্যে ব্যবহারিক কারণে))।

আমি বর্তমানে বাশ (1.08) এবং গিসি (1.40) পোর্ট করেছি এবং জিনিসগুলি কাজ করছে বলে মনে হচ্ছে। এর থেকে বোঝা যায় যে আমি কয়েক মাসের মধ্যে ব্যবহারিক কিছু পেয়ে যাব এবং বেশিরভাগ লোকেরা কী বৈশিষ্ট্যগুলি চান তা জানতে চাই। কোনও পরামর্শ স্বাগত, কিন্তু আমি সেগুলি বাস্তবায়ন করব না promise

লিনাস (torvalds@kruuna.helsinki.fi)

গীত। হ্যাঁ - এটি কোনও মিনিক্স কোড মুক্ত, এবং এটিতে একটি বহু-থ্রেডযুক্ত fs রয়েছে। এটি প্রতিরক্ষামূলক নয় (386 টাস্ক স্যুইচিং ইত্যাদি ব্যবহার করে), এবং এটি সম্ভবত এটি-হার্ডডিস্কগুলি ব্যতীত অন্য কোনও কিছুকে সমর্থন করবে না, যেমনটি আমার কাছে রয়েছে :-(।

আমি লিনাস.টিএসটিএস্ট নামে একটি ফাইল তৈরি করি , আমি সামগ্রীটি পেস্ট করি এবং তারপরে আমি কনসোলে লিখি:

sed -e 's/[^[:alpha:]]/ /g' linus.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl 

আউট পুট হবে:

 1        7 i
 2        5 to
 3        5 like
 4        5 it
 5        5 and
 6        4 minix
 7        4 a
 8        3 torvalds
 9        3 of
10        3 helsinki
11        3 fi
12        3 any
13        2 would
14        2 won
15        2 what
16        ...

আপনি যদি কেবল প্রথম 20 টি শব্দ কল্পনা করতে চান:

sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | head -n 20

জেনে রাখা জরুরী যে টিআর 'এজেড' 'এ-জেড' কমান্ডটি এখনও ইউটিএফ -8 সাপোর্ট করে না , যাতে বিদেশী ভাষায় এপ্রিস শব্দটি এপ্রিস হিসাবে অনুবাদ করা যায়।

আপনি যদি কেবলমাত্র একটি শব্দের উপস্থিতি সন্ধান করতে চান তবে আপনি শেষে একটি গ্রেপ যুক্ত করতে পারেন:

sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | grep "\sword_to_search_for$"

Search_freq নামে একটি স্ক্রিপ্টে :

#!/bin/bash
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | grep "\s$1$"

লিপিটি অবশ্যই কল করতে হবে:

 search_freq word_to_search_for

sed: -e expression #2, char 7: unterminated s 'কমান্ড`, এটিও সমস্ত শব্দ গণনা করে, তাই না? তবে ওপি একটি নির্দিষ্ট একজনকেই জিজ্ঞাসা করেছিল। এছাড়াও একটি বিট বিট সুন্দর হবে।
phk

দুঃখিত আমি একটি ভুল ছিল। আমি কমান্ডটি পুনরায় তৈরি করেছি এবং উত্তরটিতে মন্তব্য করেছি। আমার মতে, প্রশ্ন থেকে, তিনি কেবল একটি শব্দের বা ঘটনাদির একটি ফ্রিকোয়েন্সি ocurrency পেতে চাইবেন তবে এটি জানা অসম্ভব। তবে আপনি কেবল একটি শব্দ পেতে চাইলে আপনি শেষে একটি গ্রেপ যুক্ত করতে পারেন।
রজার বোরেল

3

আপনি কীগুলিতে বা JSON ডেটার মানগুলিতে শব্দের সাথে মিল রাখতে চান কিনা তার উপর নির্ভর করে আপনি কেবলমাত্র কী বা ডেটা থেকে কেবল মানগুলি বের করতে চাইবেন। অন্যথায় আপনি কিছু শব্দকে কী এবং মান উভয় হিসাবে দেখা দিলে খুব বেশি বার গণনা করতে পারেন।

সমস্ত কী বের করতে:

jq -r '..|objects|keys[]' <file.json

এটি পুনরুক্তরূপে পরীক্ষা করে যে বর্তমান জিনিসটি কোনও বস্তু কিনা এবং এটি যদি হয় তবে এটি কীগুলি বের করে। আউটপুটটি প্রতিটি লাইনে কীগুলির একটি তালিকা হবে।

সমস্ত মান বের করতে:

jq -r '..|scalars' <file.json

এটি একইভাবে কাজ করে, তবে কয়েকটি পদক্ষেপ কম রয়েছে।

এরপরে আপনি উপরের আউটপুটটি পাইপ করতে পারেন grep -c 'PATTERN'(কীগুলি বা মানগুলির সাথে কিছু প্যাটার্নের সাথে মেলে), বা grep -c -w -F 'WORD'( কী বা মানগুলির সাথে একটি শব্দের সাথে মিল রাখতে ), বা grep -c -x -F 'WORD'(একটি সম্পূর্ণ কী বা মানটির সাথে মেলে), বা অনুরূপ, আপনার গণনা করা


0

এই জাতীয় কিছু নিয়ে আমার কাছে জেএসন রয়েছে: "number":"OK","number":OK"এক লাইনে একাধিকবার পুনরাবৃত্তি।

আমার সাধারণ "ওকে" কাউন্টার:

sed "s|,|\n|g" response | grep -c OK


-1

আমি উপস্থিতির সংখ্যা খুঁজতে নীচে awk কমান্ড ব্যবহার করেছি

উদাহরণ ফাইল

বিড়াল ফাইল 1

praveen ajay 
praveen
ajay monkey praveen
praveen boy praveen

কমান্ড প্রয়োগ করুন:

awk '{print gsub("praveen",$0)}' file1 | awk 'BEGIN{sum=0}{sum=sum+$1}END{print sum}'

আউটপুট

awk '{print gsub("praveen",$0)}' file1 | awk 'BEGIN{sum=0}{sum=sum+$1}END{print sum}'

5

বা ঠিক awk '{sum+=gsub("praveen","")} END {print sum+0}'
জি-ম্যান

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