বাশ ব্যবহার করে একটি স্ট্রিংয়ের ক্ষেত্রে চরের উপস্থিতি গণনা করুন


123

আমাকে ব্যাশ ব্যবহার করে একটি স্ট্রিংয়ের সাথে চরের সংখ্যার সংখ্যা গণনা করতে হবে ।

নিম্নলিখিত উদাহরণে, গৃহস্থালির কাজ যখন (উদাহরণস্বরূপ) t, এটা echoগুলি ঘটনার সঠিক সংখ্যা tমধ্যে var, কিন্তু চরিত্র কমা বা সেমিকোলন, এটা শূন্য ছাপে আউট:

var = "text,text,text,text" 
num = `expr match $var [,]`
echo "$num"

উত্তর:


118

আমি নিম্নলিখিত awkকমান্ডটি ব্যবহার করব :

string="text,text,text,text"
char=","
awk -F"${char}" '{print NF-1}' <<< "${string}"

আমি স্ট্রিংটি দ্বারা বিভক্ত করছি $charএবং ফলাফল ক্ষেত্রের বিয়োগ 1 টি মুদ্রণ করব।

যদি আপনার শেল <<<অপারেটরকে সমর্থন না করে তবে ব্যবহার করুন echo:

echo "${string}" | awk -F"${char}" '{print NF-1}'

5
@ হাট্রিকএনজেড তারপরে ব্যবহার করুন:$(grep -o "$needle" < filename | wc -l)
হেক

13
@ আমির আপনি কি আশা করেন?
hek2mgl

3
আপনি বাদ দিতে পারেন wc -l, কেবল ব্যবহার করুন grep -c, এটি বিএসডি গ্রেপ এবং লিনাক্স গ্রেপ উভয় ক্ষেত্রেই কাজ করে।
অ্যান্ডেন্স

8
@ এবং অনুগ্রহ grep -cকেবল মিলিত লাইনের সংখ্যা আউটপুট করবে। এটি প্রতি লাইনে একাধিক ম্যাচ গণনা করে না।
hek2mgl

1
আমি একটি স্ট্রিংয়ে '$' গণনা করতে চাই, আমি কীভাবে মূল স্ট্রিং থেকে '$' এড়াতে পারি?
মাস্ট

117

আপনি উদাহরণস্বরূপ অন্যান্য সমস্ত অক্ষর মুছে ফেলতে এবং অবশিষ্টাংশগুলি গণনা করতে পারেন, যেমন:

var="text,text,text,text"
res="${var//[^,]}"
echo "$res"
echo "${#res}"

মুদ্রণ করবে

,,,
3

অথবা

tr -dc ',' <<<"$var" | awk '{ print length; }'

অথবা

tr -dc ',' <<<"$var" | wc -c    #works, but i don't like wc.. ;)

অথবা

awk -F, '{print NF-1}' <<<"$var"

অথবা

grep -o ',' <<<"$var" | grep -c .

অথবা

perl -nle 'print s/,//g' <<<"$var"


4
প্রথমটি ব্যবহার করুন, সর্বদা এই জাতীয় কাজ করার জন্য অন্য প্রক্রিয়া তৈরির উপায় অবলম্বন করা উচিত, বৃহত্তর পুনরাবৃত্তি লুপগুলি ব্যবহার করার সময় এটি তাত্পর্যপূর্ণভাবে পারফরম্যান্সকে প্রভাবিত করতে পারে। নিয়ম হিসাবে পুনরাবৃত্তি বা পুনরাবৃত্তি ক্রিয়াকলাপগুলি ব্যবহার করার সময় বাহ্যিক প্রক্রিয়া প্রয়োগের একটি শেষ অবলম্বন হওয়া উচিত।
ওসিরিসগোথর

আপনি কেন পছন্দ করেন না wc? এটা গল্ফ!
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

1
@ সিরোসন্টিলি 六四 事件 法轮功 包 卓 轩 কারণ উদাহরণস্বরূপecho -n some line | wc -l
jm666

কোড ব্লক 4 আমার মতে সেরা। আমাদের এটিকে আরও সহজ করে তুলতে হবে:tr -dc ',' <<<"$var" | wc -c
বিজিস্ট্যাক

68

আপনি এটি কমান্ড trএবং wcকমান্ড দ্বারা করতে পারেন । উদাহরণস্বরূপ, eস্ট্রিংয়ে গণনা করা referee

echo "referee" | tr -cd 'e' | wc -c

আউটপুট

4

ব্যাখ্যা: কমান্ড tr -cd 'e''ই' ব্যতীত অন্য সমস্ত অক্ষর সরিয়ে দেয় এবং কমান্ড wc -cঅবশিষ্ট অক্ষর গণনা করে।

একাধিক লাইন ইনপুটও এই সমাধানের জন্য ভাল, যেমন আদেশটি ফাইলটিতে cat mytext.txt | tr -cd 'e' | wc -cগণনা করতে পারে, এমনকি এমনকি ভেবেছিল যে ফাইলটিতে অনেকগুলি লাইন থাকতে পারে।emytext.txt


3
আপনার সমাধানটি মনে রাখা সবচেয়ে পরিষ্কার এবং সহজ বলে মনে হচ্ছে, ধন্যবাদ!
জিরিস্লাভ

এটা অসাধারণ. ধন্যবাদ!
কোডি গ্রান্থাম

আমি এটাকে ভালবাসি, কারণ আমি বাজে ঘৃণা করি!
franzisk

3

প্রত্যেকের দুর্দান্ত উত্তর এবং মন্তব্যগুলির উপর ভিত্তি করে তৈরি করা, এটি হ'ল স্বল্পতম এবং মিষ্টিতম সংস্করণ:

grep -o "$needle" <<< "$haystack" | wc -l


2

আপনার সার্ভারে এটি থাকলে ভাল কাজ করে

var="text,text,text,text" 
num=$(echo "${var}" | awk -F, '{print NF-1}')
echo "${num}"

ঠিক যেমন একটি নোট: awk -F,একটি জন্য চেহারা ,। আপনি নিম্নলিখিতটি করতে পারেন:awk -F"${your_char}"
Emixam23

1

আমি নিম্নলিখিত পরামর্শ দিতে হবে:

var="any given string"
N=${#var}
G=${var//g/}
G=${#G}
(( G = N - G ))
echo "$G"

অন্য কোনও প্রোগ্রামে কল নেই


1

এটিও পরীক্ষা করে দেখুন, উদাহরণস্বরূপ আমরা গণনা করতে চাই t

echo "test" | awk -v RS='t' 'END{print NR-1}'

বা ভিতরে python

python -c 'print "this is for test".count("t")'

বা আরও ভাল, আমরা আমাদের স্ক্রিপ্টটি দিয়ে গতিশীল করতে পারি awk

echo 'test' | awk '{for (i=1 ; i<=NF ; i++) array[$i]++ } END{ for (char in array) print char,array[char]}' FS=""

এই ক্ষেত্রে আউটপুট যেমন হয়:

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