উত্তর:
গ্রেপ এর -o
লাইন উপেক্ষা করে কেবল ম্যাচগুলিকে আউটপুট দেয়; wc
তাদের গণনা করতে পারেন:
grep -o 'needle' file | wc -l
এটি 'সুই' বা 'মাল্টিনেডেল' এর সাথেও মিলবে।
শুধুমাত্র একক শব্দ:
grep -o '\bneedle\B' file | wc -l
# or:
grep -o '\<needle\>' file | wc -l
\b
এবং \B
কি করে?
uniq
কেবল সংলগ্ন অভিন্ন লাইনগুলি সরিয়ে ফেলবে, আপনি যদি sort
আগে uniq
থেকেই নিশ্চিত হন না যে নকলগুলি সর্বদা তত্ক্ষণাত সংলগ্ন হবে তবে আপনার খাওয়ানোর আগে আপনাকে খাওয়াতে হবে।
আপনি গনুহ, grep (সবসময় Linux এবং Cygwin, মাঝে মাঝে অন্যত্র দিকে) থাকে, তাহলে আপনি পারবেন না থেকে আউটপুট লাইন গণনাgrep -o
: grep -o needle | wc -l
।
পার্ল সঙ্গে, এখানে কয়েকটি উপায় (পরও এটা আমি পুলিশের চেয়ে বেশি মার্জিত এটি হয় সংশোধন করা হয়েছে )।
perl -lne 'END {print $c} map ++$c, /needle/g'
perl -lne 'END {print $c} $c += s/needle//g'
perl -lne 'END {print $c} ++$c while /needle/g'
কেবল পসিক্স সরঞ্জামের সাহায্যে একটি পদ্ধতির, যদি সম্ভব হয় তবে গ্রেপতে যাওয়ার আগে ইনপুটটিকে একক ম্যাচের সাথে লাইনগুলিতে ভাগ করে নেওয়া হয়। উদাহরণস্বরূপ, আপনি যদি পুরো শব্দটি সন্ধান করছেন তবে প্রথমে প্রতিটি অ-শব্দ অক্ষরকে একটি নতুন লাইনে পরিণত করুন।
# equivalent to grep -ow 'needle' | wc -l
tr -c '[:alnum:]' '[\n*]' | grep -c '^needle$'
অন্যথায়, পাঠ্য প্রক্রিয়াজাতকরণের এই বিটটি করার জন্য কোনও স্ট্যান্ডার্ড কমান্ড নেই, সুতরাং আপনাকে সেডে ফিরে যেতে হবে (আপনি যদি কোনও মাসোশিস্ট হন) বা অজস্র।
awk '{while (match($0, /set/)) {++c; $0=substr($0, RSTART+RLENGTH)}}
END {print c}'
sed -n -e 's/set/\n&\n/g' -e 's/^/\n/' -e 's/$/\n/' \
-e 's/\n[^\n]*\n/\n/g' -e 's/^\n//' -e 's/\n$//' \
-e '/./p' | wc -l
এখানে একটি সহজ সমাধান sed
এবং এটি ব্যবহার করা হয়েছে grep
, যা স্ট্রিং বা এমনকি বইয়ের নিয়মিত প্রকাশের জন্য কাজ করে তবে অ্যাঙ্কার্ড প্যাটার্নগুলির সাথে কয়েকটি কোণায় ব্যর্থ হয় (যেমন এটি দুটি ক্ষেত্রে ^needle
বা এর দুটি সন্ধান \bneedle
করে needleneedle
)।
sed 's/needle/\n&\n/g' | grep -cx 'needle'
নোট করুন যে উপরের সিড বিকল্পগুলিতে আমি \n
একটি নতুন লাইনটি বোঝাতে চাইছিলাম। এটি প্যাটার্ন অংশে আদর্শ, তবে প্রতিস্থাপন পাঠ্যে, বহনযোগ্যতার জন্য, ব্যাকস্ল্যাশ-নিউলাইন বিকল্পের জন্য \n
।
যদি আমার মতো আপনিও "উভয়ই; প্রতিটি একেবারে একবার" চেয়েছিলেন , (এটি আসলে "হয়; দু'বার") তবে এটি সহজ:
grep -E "thing1|thing2" -c
এবং আউটপুট জন্য পরীক্ষা করুন 2
।
এই পদ্ধতির সুবিধা (যদি ঠিক একবার হয় আপনি যা চান তা) এটি সহজে আইশ করে।
জাজ এবং needle
ফিল্ড বিভাজক হিসাবে আরও একটি সমাধান :
awk -F'^needle | needle | needle$' '{c+=NF-1}END{print c}'
যদি আপনি needle
বিরামচিহ্ন অনুসরণ করে মেলাতে চান তবে ক্ষেত্র বিভাজককে সেই অনুযায়ী পরিবর্তন করুন
awk -F'^needle[ ,.?]|[ ,.?]needle[ ,.?]|[ ,.?]needle$' '{c+=NF-1}END{print c}'
বা ক্লাসটি ব্যবহার করুন: [^[:alnum:]]
সমস্ত অ্যালफा অক্ষরকে অন্তর্ভুক্ত করতে।
আপনার উদাহরণটি কেবল প্রতি-লাইনে সংখ্যার প্রিন্ট করে এবং ফাইলের মোটটি নয়। যদি আপনি এটি চান তবে এর মতো কিছু কাজ করতে পারে:
perl -nle '$c+=scalar(()=m/needle/g);END{print $c}'
grep
সুনির্দিষ্ট, তবে যে কেউ ব্যবহার করছেনack
, উত্তরটি সহজack -ch <pattern>
।