ম্যাচিং লাইনটি থেকে ম্যাচিং লাইন এবং নবম লাইনটি প্রিন্ট করুন


18

আমি ম্যাচ করা লাইনটি এবং ম্যাথড লাইনটি থেকে 4 র্থ লাইনটি (যে সন্ধানের জন্য আমি প্রকাশ করছি এমন রেখাটি) মুদ্রণ করার চেষ্টা করছি।

আমি নিম্নলিখিত কোড ব্যবহার করছি: sed -n 's/^[ \t]*//; /img class=\"devil_icon/,4p' input.txt

তবে এটি কেবল মিলিত রেখাটি মুদ্রণ করে।

এটি কেবল চতুর্থ লাইন মুদ্রণ করে। awk 'c&&!--c;/img class=\"devil_icon/{c=4}' input.txt

আমার সাথে ম্যাচ করা লাইন এবং চতুর্থ লাইন উভয়ই মুদ্রণ করা দরকার।


ব্যবহার egrep "pattern" -A4
ভ্যালেন্টাইন বজরামি

@ Val0x00ff যা খুব মাঝখানে রেখাগুলি প্রিন্ট করে .. এটি: এটি
ম্যাচ করা

আপনি বলছেন "আমি ম্যাচ করা লাইনটি এবং ম্যাচযুক্ত লাইন থেকে 4 র্থ লাইনটি প্রিন্ট করার চেষ্টা করছি"। এটি grep -A 4 "pattern" file | sed -n '4p'আপনাকে যা করতে চায় ঠিক
তেমন করে

না এটা হয় না। উপরের </td>
কোডটির

উত্তর:


18

দারুণভাবে, আপনি নীচের হিসাবে এটি করতে চাই

awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`

অথবা

awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`

ব্যাখ্যা

প্রথম সমাধানটি মেলে এমন সমস্ত লাইন সন্ধান করে pattern। এটি কোনও মিল খুঁজে পেলে NRএটি অ্যারেতে রেকর্ড নম্বর ( ) সংরক্ষণ করে nr। এটি NRএকই অ্যারে থেকে 4 র্থ রেকর্ড সংরক্ষণ করে । এটি দ্বারা করা হয় nr[NR+4]। প্রতিটি রেকর্ড ( NR) তারপরে এটি nrঅ্যারে উপস্থিত রয়েছে কিনা তা পরীক্ষা করে নেওয়া হয় , যদি তাই রেকর্ডটি মুদ্রিত হয়।

দ্বিতীয় সমাধানটি মূলত একইভাবে কাজ করে, যখন এটি মুখোমুখি হয় এবং patternএটি সেই লাইনটি মুদ্রণ করে, এবং তারপরে অ্যারেতে 4 তম রেকর্ড সংরক্ষণ করে nr, তারপরে পরবর্তী রেকর্ডে যায়। তারপরে যখন awkএই চতুর্থ রেকর্ডটির মুখোমুখি NR in nrহবে তখন ব্লকটি কার্যকর হবে এবং পরে এই +4 রেকর্ডটি মুদ্রণ করবে।

উদাহরণ

এখানে একটি উদাহরণ ডেটা ফাইল sample.txt,।

$ cat sample.txt 
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16

1 ম সমাধান ব্যবহার:

$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt 
4 blah
8
10 blah
14

২ য় সমাধানটি ব্যবহার করে:

$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt 
4 blah
8
10 blah
14

3
ভাল, +1। আপনি awkএখানে প্রচুর শর্টকাট ব্যবহার করছেন, আপনি কি একটি সংক্ষিপ্ত বিবরণ যোগ করতে পারেন (মুদ্রণের মতো জিনিসগুলিকে বিশৃঙ্খলায় অন্তর্ভুক্ত করা হচ্ছে এবং সেই অ্যারেগুলি সাহসী ইত্যাদি)?
টেরডন

@terdon এর সাথে একটি সম্মত দয়া করে আপনি কোডটি কিছুটা ব্যাখ্যা করতে পারেন।
দেবলাল

@ এসএলএম সম্পূর্ণ উত্তরটি উন্নত ও সরবরাহ করার জন্য ধন্যবাদ!
ভ্যালেন্টাইন বজরামি

1
উত্তরের জন্য ধন্যবাদ, আমি এটি দিয়ে কিছু নতুন কিছু শিখেছি।
SLM

4
sed -n 's/^[ \t]*/; /img class=\"devil_icon/,+4 { 3,5d ; p }' input.txt

আমি প্রিন্ট করার আগে যথাযথ লাইনগুলির মুছে ফেলার জন্য কেবল যুক্ত করছি { 3,5d ; p }


আপনার অভিব্যক্তি একটি ত্রুটি তৈরি করে: sed: -e expression #1, char 18: unknown option to s'`
খনিজগুলি

4

আপনি এই -Aবিকল্পটির সাহায্যে চেষ্টা করতে পারেন grep, যা মিলবে লাইনের পরে কতগুলি লাইন প্রিন্ট করা উচিত তা নির্দিষ্ট করে। এটির সাথে কাপল করুন sedএবং আপনি প্রয়োজনীয় লাইনগুলি পেয়ে যাবেন।

grep -A 4 pattern input.txt | sed -e '2,4d'

ব্যবহার করে sed, আমরা দ্বিতীয় লাইন থেকে চতুর্থ অবধি মুছে ফেলি।


3
এটি patternফাইলের একক ম্যাচ ধরেছে ।
টেরডন

2

পার্লের এখানে এমন একটি উপায় যা একটি স্বেচ্ছাসেবী সংখ্যার সাথে মিলিয়ে যায় deal

perl -ne '/pattern/ && do{$c=$.; print}; $.==$c+4 && print' file > new_file`

পার্লে বিশেষ পরিবর্তনশীল $.হ'ল বর্তমান লাইন নম্বর number সুতরাং, প্রতিবার যখন আমি একটি লাইন মিল খুঁজে পাই pattern, আমি এটি মুদ্রণ করি এবং এর লাইন নম্বরটি সংরক্ষণ করি $c। আমি তখন আবার মুদ্রণ করি যখন বর্তমান লাইন নম্বরটি আগের মুদ্রণের চেয়ে 4 টি বেশি হয়।


0
awk 'c&&!--c;/img class=\"devil_icon/{c=4};/img class=\"devil_icon/' input.txt

আপনি মূলত একটি অনুসন্ধান এবং প্রতিস্থাপন করছেন। আপনি একই আদেশে কেবল একটি অনুসন্ধান যুক্ত করতে পারেন এবং এটি উভয়ই মুদ্রণ করবে :)

awk 'c&&!--c;/pattern/{c=4};/pattern/' input.txt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.