গ্রেপ ম্যাচের পরে কোনও ফাইলের রেখার সংখ্যা কীভাবে গণনা করব?


14

আমি একটি সিএসভি ফাইলে সমস্যাযুক্ত সারির পরে রেখার সংখ্যা গণনা করার চেষ্টা করছি। আমি সচেতন যে grep -a #কোনও ম্যাচ সন্ধানের পরে আমি # সংখ্যক লাইন আউটপুট তৈরি করতে সিনট্যাক্সটি ব্যবহার করতে পারি । আমি কেবলমাত্র লাইনের প্রকৃত সংখ্যায় আগ্রহী। আমি বুঝতে পারছি যে আমি নম্বরটি MAX_INT এ সেট করতে পারলাম, এটি একটি ফাইলে পাইপ দিয়ে আরও কিছু প্রক্রিয়াজাতকরণ করতে পারি।

আমি কেবল আমাকে গণনাটি বলার জন্য একটি সংযুক্ত এক-লাইনারের সন্ধান করছি।

কোনও পরামর্শ?

উত্তর:


15
{ grep -m1 match; grep -c ''; } <file

এটি ডাব্লু / জিএনইউ grepএবং একটি কার্যকর lseek()পীড়িত কাজ করবে । প্রথমটি grep1 টি আটচে থামবে -m, এবং দ্বিতীয়টি -cইনপুটটিতে থাকা প্রতিটি লাইনকে জমা করবে ।

জিএনইউ ছাড়া grep:

{ sed '/match/q'; grep -c ''; } <file

অবশ্যই, ডাব্লু / grepআপনি পাশাপাশি এর যে কোনও / সমস্ত বিকল্প ব্যবহার করতে পারেন, এবং একটি ম্যাচে থামানো মোটেই প্রয়োজন নয়।


এই উভয়ই লাইনটি মুদ্রণ করে এবং দ্বিতীয়টি প্রথম ম্যাচ পর্যন্ত মুদ্রণ করে এবং তারপরে আমার জন্য 0?
123

@ User112638726 - আপনি grep -m1 match >/dev/nullঅবশ্যই প্রথম ম্যাচের প্রিন্টআউট ড্রপ করতে পারেন । এবং আপনার দ্বিতীয় সমস্যাটি একটি জিএনইউ sed- এটি প্রতি অনুমান অনুযায়ী তার ইনপুটটিকে রিসেট করে না। আপনাকে -uডাব্লু / জিএনইউ ব্যবহার করতে হবে - যা সর্বদা কাম্য নয়। আমি আরও পরিষ্কার হতে পারতাম, তবে আমার ধারণা ছিল যে একটি জিএনইউ grepএবং জিএনইউ sedজোড়ায় আসবে। আমিও মনে করি, পুনর্নির্দেশকে grep -qm1শর্টকাটে কাজ করতে পারে /dev/null- তবে জিএনইউ grepঅদ্ভুত জিনিসগুলি ডাব্লু / -qএবং আমি কীভাবে এই দুজন একসাথে কাজ করে তা মনে করতে পারি না।
মাইকসার্ভ

1
উত্তম উত্তর - সত্যই কমান্ড গ্রুপিংয়ের শক্তি প্রদর্শন করে। আমি নিশ্চিতভাবে জানি না, তবে আমি অনুমান করব যে wc -lএটির চেয়ে খানিকটা সস্তা grep -c ''
ডিজিটাল ট্রমা

1
@ ডিজিটালট্রামা - হ্যাঁ, আমি এটিকে বিবেচনা করেছি (পূর্ববর্তী অবস্থানে) , তবে আমি এটি ইতিমধ্যে লিখেছি এবং এটি প্রায় ছড়াছড়ি করেছে, তাই আমি বুঝতে পেরেছিলাম যে আমি যথেষ্ট পরিমাণে একা থাকি। এবং যাইহোক, আপনি এটি বলেছিলেন, তাই আমি এখনই খুব সহজ ঘুমাব।
মাইকসার্ভ

9

এখানে একটি উপায়।

$ cat foo
aaa
bbb
ccc
ddd
eee
fff
$ awk '/^ddd/{a=FNR}END{print FNR-a}' foo
2
$

4
এটি কোডগল্ফ নয়, আপনি কি বিশদ দিতে পারবেন (এফএনআর, শেষ এবং আরও কিছু)?
আর্চেমার

3
অবশ্যই। এনজিও ইনপুট রেকর্ড নম্বর সনাক্ত করতে FNR ব্যবহার করে। ফাইল ফাইলের শেষে পৌঁছানোর পরে এন্ড কোড কার্যকর করা হয়। সুতরাং কোনও ম্যাচ পাওয়া গেলে, বর্তমান রেকর্ড নম্বর রেকর্ড করা হয়। ফাইলের শেষে পৌঁছানোর পরে, সেই সংখ্যাটি ফাইলের মোট লাইন সংখ্যা থেকে বিয়োগ করা হয়।
স্টিভ

1
পাশাপাশি এটি কেবল একটি এনআরআর ব্যবহার করতে পারে।
123

6

আরেকটি উপায় - এর ব্যবহারটি dcকিছুটা রহস্যজনক তবে এখানে বেশ সুন্দরভাবে কাজ করা হয় বলে মনে হচ্ছে:

sed -n '/problem/=;$=' prob.txt | dc -e '??r-p'

sedprob.txt"সমস্যা" এবং শেষ লাইনটি অনুসন্ধান করে এবং =উভয়ের লাইন সংখ্যা আউটপুট করতে কমান্ডটি ব্যবহার করে ।

dc এই দুটি মান স্ট্যাকের উপরে পড়ে, তাদের বিপরীত করে, বিয়োগ করে এবং পার্থক্যটি মুদ্রণ করে।


5

পুরোপুরি সেড দিয়ে (পাইপের সাথে দুটি কমান্ড হলেও)

sed '/ddd/,$!d' file | sed -n '$='

লাইনের আগে সমস্ত লাইন মুছে ফেলে এবং তারপরে পরবর্তী কমান্ডটি নতুন ফাইলটিতে লাইন গণনা করে।


3

এতে সমস্যাযুক্ত এক পর্যন্ত সমস্ত লাইন মুছে ফেলা উচিত (এবং অন্তর্ভুক্ত) এবং তারপরে বাকী রেখাগুলি গণনা করুন:

sed '1,/problem/d' data.txt | wc -l

1
(ধরে নিই "সমস্যা" প্রথম লাইনে নেই)
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.