গ্রেপ: প্রতি লাইনে ম্যাচের সংখ্যা গণনা করুন


26

আমি ম্যাচ সংখ্যা পেতে (এই মামলার ঘটনার চেষ্টা করছি {বা }একটি .tex ফাইলের প্রতিটি লাইনে)।

আমি জানি যে -oপতাকাটি কেবল ম্যাচটি ফেরত দেয়, তবে এটি প্রতিটি ম্যাচকে একটি নতুন লাইনে ফিরিয়ে দেয়, এমনকি -nপতাকাটির সাথে মিলিত হয় । পুনরাবৃত্তিগুলি গণনা করার জন্য আমি এটিকে পাইপ করতে পারি এমন কিছুই জানি না। -cপতাকা শুধুমাত্র সম্পূর্ণ ফাইল ম্যাচ মোট সংখ্যা ফেরৎ - হয়তো, আমি একটি সময়ে নল এক লাইন grep করতে পারে?

উত্তর:


27
grep -o -n '[{}]' <filename> | cut -d : -f 1 | uniq -c

আউটপুটটি এমন কিছু হবে:

3 1
1 2

অর্থ প্রথম লাইনে 3 টি ঘটনা এবং দ্বিতীয়টিতে 1 টি।

Https://stackoverflow.com/a/15366097/3378354 থেকে নেওয়া হয়েছে ।


ধন্যবাদ - গুগল এসইউতে প্রচুর রেইগেক্স হিট পেয়েছে, তবে এটি এসও তে পাওয়া যায় নি, যার কাছে এমনকি একটি রেইগেক্স ট্যাগ রয়েছে বলে মনে হয় না। sortকঠোরভাবে প্রয়োজনীয় হিসাবে, grep এর আউটপুট লাইন সংখ্যা অনুসারে বাছাই হয় না, কিন্তু আমি মনে করি এটা আগে ভাল অভ্যাস uniq
ক্রিস এইচ

2
সম্ভবত ট্যাগ করা হয়নি regexকারণ রেজেক্স সহজ অংশ।
টম জিচ

এটি কি আসলে দরকার sort -n? এটি কি লাইন নম্বর ক্রম থেকে বেরিয়ে আসে না?
টম জিচ

আপনি ঠিক বলেছেন, sort -nপ্রয়োজন হয় না। ধন্যবাদ।
মোবিয়াস

@ টমজাইচ, এটি প্রমাণিত হয়েছে যে আপনি সঠিক ছিলেন, তবে আমি যদি জানতাম যে আমি জিজ্ঞাসা না করতাম। গ্রেপ থেকে ট্যাগে মানসিক লাফ: রেজেেক্স সম্ভবত কিছুটা হলেও ছিল।
ক্রিস এইচ

3

বিভিন্ন সমাধান পড়ার পরে, আমি মনে করি এটিই সমস্যার সবচেয়ে সহজ পদ্ধিতি:

while read i; do echo $i |grep -o "matchingString"| wc -l;  done < input.txt

3
আমার মতে সেরা সমাধান। এমনকি আরো এক নল দ্বারা কমিয়ে সরলীকৃত হতে পারে: grep -o "matchingString" <<< $i | wc -l
বেনিয়ামিন ডাব্লু।

1
এটি যদিও আরও ধীর গতির মাত্রার অর্ডার হবে তবে অন্য বিকল্পগুলি
রাহুল

1

grepএকটি প্রয়োজনীয়তা ব্যবহার করছেন ? এখানে একটি বিকল্প রয়েছে:

সেড এর / [^ {}] // জি ' আপনার_ফিল | awk '{প্রিন্ট এনআর, দৈর্ঘ্য}'

sedছাড়া অন্য সমস্ত অক্ষর আউট রেখাচিত্রমালা {এবং } (অর্থাত, শুধুমাত্র ছাড়ার {এবং }অক্ষর), এবং তারপর awkগন্য অক্ষর প্রতিটি লাইনে (যা শুধু হয় {এবং }অক্ষর)। কোনও মিল নেই লাইন দমন করতে,

সেড এর / [^ {}] // জি ' আপনার_ফিল | awk '/./ {প্রিন্ট এনআর, দৈর্ঘ্য}'

নোট করুন যে আমার সমাধানটি ধরে নিচ্ছে (প্রয়োজনীয়) যে আপনি যে স্ট্রিংগুলি সন্ধান করছেন সেটি একক অক্ষর। মোবিয়াসের উত্তরটি আরও সহজেই বহু-চরিত্রের স্ট্রিংগুলিতে মানিয়ে যায়। এছাড়াও, আমাদের উত্তরগুলির মধ্যে দুটিও আগ্রহের অক্ষর / স্ট্রিংয়ের উদ্ধৃতিপ্রাপ্ত বা পালানো ঘটনাগুলি বাদ দেয় না; যেমন,

{ "nullfunc() {}" }

চারটি ধনুর্বন্ধনী অক্ষর সমন্বিত বলে বিবেচিত হবে।


grepআসলেই কোনও প্রয়োজন ছিল না, ঠিক তখনই আমি সমাধানের সন্ধান করতে শুরু করেছি, কারণ এটি আমাকে ঘনিষ্ঠভাবে কিছু দিয়েছে। আমার কখনই আড্ডার দরকার পড়েনি, তাই উপরের উত্তরটি ব্যবহার না করে আমি পরীক্ষার সুযোগ হিসাবে এটি ব্যবহার করতাম - আমি এখনও থাকতে পারি। আমি যা পরিষ্কার করতে ব্যর্থ হয়েছি (তবে এটির কোনও উত্তরই প্রভাবিত করে না) তা হ'ল আমি ব্র্যাককেটে একবার স্ক্রিপ্টটি চালাতে চেয়েছিলাম, যাতে কোনও মিল খুঁজে পাওয়া যায় না (ল্যাটেক্স উত্সে, এখানে একটি টেবিলের জন্য) যেখানে বেশিরভাগ জুড়ে থাকে একটি লাইন
ক্রিস এইচ

আমি "ব্র্যাপকেটে একবার স্ক্রিপ্টটি চালানো" বলতে কী বোঝাতে চাইছি তা সম্পর্কে আমি নিশ্চিত নই তবে আপনি যদি একটি ব্রেস মেলবন্ধটি সন্ধান করতে চান তবে আপনি কিছু পেতে চেষ্টা করতে পারেন sed 's/{[^{}]*}//g' your_file | grep –n '[{}]', যেখানে sedস্ট্রিপগুলি জোড়া (মিলিয়েছে)। আপনার যদি নেস্টেড sed 's/{[^{}]*}//g;s/{[^{}]*}//g;s/{[^{}]*}//g;…' …জোড় থাকে তবে s/{[^{}]*}//gআপনার গভীর নীড় থেকে যতবার ঘন ঘন পুনরাবৃত্তি করুন তা ব্যবহার করুন ।
স্কট

আমি বোঝাতে চাইছি `সেডস এর / [^}] // জি 'তোমার_ফিল | awk '{প্রিন্ট এনআর, দৈর্ঘ্য}' এবং 'গুলি / [^ {] // জি' আপনার_ফাইলে | awk '{প্রিন্ট এনআর, দৈর্ঘ্য}'। আমি সত্যিই বাসা বাঁধছি, এবং গভীর স্তরের বাইরে কাজ করাকে মনে হচ্ছে এক রজনী। অনেকগুলি লাইনকে মুঠোয় পরিণত করে (এমন কয়েকটি ক্ষেত্রে রয়েছে যেখানে বৈধ কারণগুলির জন্য ধনুর্বন্ধনী শুধুমাত্র একাধিক লাইনের সাথে মেলে) ভালভাবে কাজ করে (আমি জেডিট ব্যবহার করি যা মেলা বন্ধনীটি হাইলাইট করে - যে কোনও ধরণের বন্ধনী এটি বোঝে - তাই আমি সত্যিই করেছি কেবল এটি সঙ্কুচিত করা দরকার)।
ক্রিস এইচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.