একটি ফাইলের মধ্যে একটি নির্দিষ্ট চরিত্রের উপস্থিতিগুলি কীভাবে গণনা করা যায়?


18

উদাহরণস্বরূপ, আমরা সমস্ত উদ্ধৃতি ( ") অক্ষর গণনা করতে চাই ; ফাইলগুলিতে থাকা উচিতের চেয়ে আরও বেশি মূল্যায়ন থাকলে কেবল আমরা উদ্বেগ করি।

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

cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,"override_uid","true"
cluster-env,"recovery_enabled","false"

প্রত্যাশিত ফলাফল:

16


উত্তর:


26

আপনি tr(অক্ষর অনুবাদ বা মুছুন) একত্রিত করতে পারেন ( wcশব্দ, লাইন, অক্ষর গণনা ) এর সাথে :

tr -cd '"' < yourfile.cfg | wc -c

( -dসমস্ত চরিত্রকে cএকত্রে পূর্ণ করুন "এবং তারপরে cহ্যাকারদের গণনা করুন ))


20

গ্রেপ পদ্ধতির:

grep -o '"' file | wc -l
16 
  • -o - আউটপুট কেবলমাত্র সাবস্ট্রিংয়ের সাথে মিলে

বা একক গাওক সহ :

awk -v RS='' -v FPAT='"' '{print NF}' file
16
  • RS='' - খালি রেকর্ড বিভাজক (নতুন লাইনের পরিবর্তে)

  • FPAT='"' - ক্ষেত্রের মান নির্ধারণকারী প্যাটার্ন


-oমানক grepইউটিলিটিতে একটি মানহীন জিএনইউ এক্সটেনশন । এটির জন্য পসিক্স ডকুমেন্টেশনেgrep উল্লেখ নেই ।
অ্যান্ড্রু হেনেল

4

যদি ফাইলের দুটি লাইনের মধ্যে দ্বিগুণ উদ্ধৃতিগুলির একটি বিজোড় সংখ্যা থাকে তবে মোট ডাবল উদ্ধৃতিগুলির সমষ্টিটি সমান হবে এবং আপনি ভারসাম্যহীন উদ্ধৃতি সনাক্ত করতে পারবেন না (এটি আমি ধারণা করি যা আপনি আসলে করতে চান তবে আমি ভুল হতে পারি) )।

এই awkস্ক্রিপ্টটি ইনপুট লাইনের যে কোনও লাইনটির বিশদ সংখ্যার উক্তি রয়েছে:

awk -F'"' 'NF % 2 == 0 { printf("Line %d has odd quoting: %s\n", NR, $0) }'

আমরা ক্ষেত্রের বিভাজক (সেট FS) এর "সঙ্গে -F'"'যার মানে এটা বিজোড় কোট হয়েছে থাকে একটি লাইন ক্ষেত্র একটি এমনকি নম্বর আছে। NFসাম্প্রতিক রেকর্ডে ক্ষেত্রের NRসংখ্যা এবং এটি বর্তমান রেকর্ডের অর্ডিনাল সংখ্যা ("লাইন নম্বর")।

নিম্নলিখিত ইনপুট দেওয়া হয়েছে:

$ cat file
cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,override_uid","true"
cluster-env,recovery_enabled","false"

আমরা পেতে

$ awk -F'"' 'NF % 2 == 0 { printf("Line %d has odd quoting: %s\n", NR, $0) }' file
Line 3 has odd quoting: cluster-env,override_uid","true"
Line 4 has odd quoting: cluster-env,recovery_enabled","false"

কিছুটা এইরকম

$ grep -o '"' | wc -l

এই ফাইলে "14" ফিরিয়ে দেবে।



2

খাঁটি বেস:

var="$(< file.txt)"
tmp="${var//[^\"]/}"
echo ${#tmp}

কি tmpএকটি অ্যারের? যদি হ্যাঁ, tmpএকটি অ্যারে হয়?
টিম

@ টিম, না tmpএই স্নিপেটে একটি সাধারণ শেল পরিবর্তনশীল। এবং আমি এই উত্তরটিকে নিম্নমুখী করে তুলছি কারণ এই প্রশ্নটিতে উল্লিখিত ফাইলের পরিবর্তে একটি চলক ( var) পরিবর্তে একটি চরিত্রের সংখ্যার সংখ্যা গণনা করা হচ্ছে ।
ওয়াইল্ডকার্ড

0

চেষ্টা করে দেখুন:

grep -0 '"' File -c

তবে একই লাইনে দুই বা ততোধিক চর যদি এটি কাজ করবে না। তারা একটি চর হিসাবে গণনা করা হবে


1
U&L এ স্বাগতম! এটি আসলে প্রশ্নের উত্তর বলে মনে হচ্ছে না, কারণ এটি অক্ষরের পরিবর্তে লাইন গণনা করবে। কার্যকর উত্তরগুলি লিখতে U&L তে জোরালোভাবে উত্সাহ দেওয়া হয় - সহায়তা কেন্দ্রে উত্তর দেওয়া দেখুন see আপনি এটির উন্নতি করতে চাইতে পারেন।
ফ্রে-সান


0

এক্সেন্ট্রিক ডাবল জিএনইউ grep পদ্ধতি:

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