"এক্স" এর মধ্যে লাইন গণনা করুন


13

আমি "এক্স" এর মধ্যে লাইন গণনা করতে চাই। এইটা শুধুমাত্র একটা উদাহরণ; আমাকে কোডটি জটিল জৈবিক ফলাফলের জন্য প্রয়োগ করতে হবে। যদি আপনি কিছু কমান্ড পরামর্শ দিতে পারেন বাঞ্ছনীয় ব্যবহার আমি কি কৃতজ্ঞ হবে awk, grepবা sedযেমন আমি ঐ সাথে পরিচিত নই।

উদাহরণ:

X
Y
Y
Y
X
Y
Y
Y
Y
X
Y
X

পছন্দসই আউটপুট:

3
4
1

2
আপনি যদি এই ক্ষেত্রে কাজ করে থাকেন তবে আপনি বায়োইনফরম্যাটিকসে আগ্রহী হতে পারেন।
টেরডন

উত্তর:


13

সহ awk:

$ awk '!/X/{count++}/X/{print count; count = 0}' input

3
4
1

না থাকা প্রতিটি লাইনের জন্য একটি গণনা বৃদ্ধি X; ধারণকারী লাইনগুলির জন্য গণনাটি মুদ্রণ ও পুনরায় সেট করুন X


2
তাহলে প্রথম লাইন না ছিল একটি X, লাইন প্রথম সংখ্যাটি এখনও গণনা করা হয়েছে এবং এই সমাধান সঙ্গে outputted, সঙ্গে প্রথম লাইন পর্যন্ত করা হবে Xমিলেছে করা হয়। EX (মন্তব্যগুলিতে নতুন লাইন যোগ করতে পারে না, তবে প্রতিটি চরিত্রের মধ্যে একটি নতুন রেখা আছে তা বিবেচনা করুন; পি): Y X Y Y X Y Y Yআউটপুট হবে:1 2
ড্যান

1
@ মুরু এটির কাজ করবে না যদি শেষদিকে এক্স না থাকে (অ্যাড করার প্রয়োজন হয় END{if (count)print count}), এবং খালি লাইন তৈরি করা যেখানে এক্স শুরু হয়েছিল যেখানে আপনি এড়াতে পারেন /X/&&countতাও যুক্ত করতে পারেন
нιηসেস

1
হেহ। একটি মন্তব্যে অভিযোগ করা হয়েছে যে শীর্ষস্থানীয় Yগুলি গণনা করা উচিত নয় কারণ তারা ঠিক দু'জনের মধ্যে নয় X; অন্য অভিযোগ করে যে পিছনে এসগুলি Yগণনা করা হয় না কারণ তারা ঠিক দু'জনের মধ্যে নয় X। আমি অপেক্ষারত অপেক্ষারত স্পষ্ট করে বলব, যদি প্রয়োজন হয়; এই উত্তরটি ঠিক আছে ঠিক ততক্ষণে।
মারু

12
$ awk '/X/ && prev{print NR-prev-1} /X/{prev=NR}' file
3
4
1

কিভাবে এটা কাজ করে:

আউগ ইনপুট ফাইলগুলি লাইন লাইন মাধ্যমে স্পষ্টভাবে পড়ে।

  • /X/ && prev{print NR-prev-1}

    যে কোনও লাইনের জন্য Xএবং আমরা এর আগে যদি একটি মান নির্ধারিত করেছি prev, তার জন্য বর্তমান লাইনটির সংখ্যা NR, বিয়োগ prevবিয়োগফলটি মুদ্রণ করুন ।

  • /X/{prev=NR}

    যে কোনও রেখার জন্য, বর্তমান লাইন নম্বরটিতে Xভেরিয়েবল সেট করুন ,।prevNR


4
হুঁ, সুন্দর। গালিগালাজ NRআমাকে একটি ধারণা দেয়:awk '/X/{print NR - 1; NR = 0}' foo
8'17

আপনাকে ধন্যবাদ, এটি আমাকে সঠিক তথ্য দেয়। যা প্রয়োজন।
রিয়া

মুরো: সুন্দর ও কৌতুকময় একটি মান খুব বেশি মুদ্রণ ব্যতীত, এটি আমার জন্য গাক এবং মক এর অধীনে কাজ করে। আমি নিশ্চিত যে এটি গ্যারান্টিযুক্ত আচরণ কিনা। @EdMorton?
1024

3
@ রিয়া যদি না আপনার প্রথম লাইন সর্বদা এক Xথাকে তবে 2 জবাবের মধ্যে আউটপুটে একটি সামান্য পার্থক্য রয়েছে কারণ আমি মুড়ুর উত্তরের নীচে একটি মন্তব্যে ব্যাখ্যা করেছি।
ডান

1
@ জন 1024 থ্যানকিউ! আমি আশা করি এটি আমাকে সাহায্য করবে।
রিয়া

6

awkওপির নমুনা ডেটাতে কাজ করে এমন একটি সহজ পদ্ধতি এবং এটি যদি Xপ্রথম বা এমনকি শেষ বা পুনরাবৃত্ত এক্স এর ক্ষেত্রে না থাকে।

awk -v RS='X' 'NF{print NF}' infile

উপরেরটি সঠিক হয় যখন ডিফল্ট এফএসের সাথে প্রতিটি লাইনে কেবল একটি ক্ষেত্র থাকে কোনও সাদা স্পেস , অন্যথায় নীচে লাইনওয়াল গণনা করার জন্য সাধারণ ক্ষেত্রে সংশোধন করা হয় । আপনি এক্স এর জায়গায় আপনার PATTERN ইনপুট করতে পারেন ।

awk -F'\n' -v RS='X' 'NF>2{print NF-2}'

নমুনা ইনপুট:

X
Y YYY Y
YY
YY Y YY YY Y Y
X
Y Y Y
X
Y
Y
X
X

আউটপুটটি হ'ল:

3
1
2

1

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

BEGIN {
    count = 0;
}

{
    if ($0 == needle) {
        if (count) {
            print count;
            count = 0;
        }
    } else {
        count++;
    }
}

এটি একটি পাঠ্য ফাইল হিসাবে সংরক্ষণ করুন, উদাহরণস্বরূপ count-rows.awk, এবং নিম্নলিখিত হিসাবে এটি প্রার্থনা:

awk -f count-rows.awk -v needle=X input

আপনি needleআপনার পছন্দ অনুসারে এর মানটি সামঞ্জস্য করতে পারেন । এই পদ্ধতির সুবিধাটি হ'ল আপনি শেল স্ক্রিপ্ট থেকে কোনও needleসমস্যা ছাড়াই ছাড়াই একটি স্বেচ্ছাচারিত মান সহ প্রোগ্রামটি শুরু করতে পারেন :

awk -f count-rows.awk -v needle="$needle" input
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.