কোনও পাঠ্য খুঁজে পাওয়ার পরে নির্দিষ্ট লাইনগুলি কীভাবে পড়বেন?


12

আমি কিছু পাঠ্য খুঁজে পাওয়ার পরে কীভাবে একটি নির্দিষ্ট সংখ্যক লাইন পড়তে পারি?

যেমন .:

"ইউনিক্স" সন্ধান করার পরে পরবর্তী দুটি লাইন পড়ুন:

Test 1
Test 2
Test 3
Test 4
UNIX
Test 5
Test 6
Test 7
Test 8
Test 9

ফলাফল হতে পারে:

Test 5
Test 6

দ্রষ্টব্য: শেষ উদাহরণে "ইউনিক্স" একটি যুক্তি, এবং তাই এটি অন্য কোনও পাঠ্য হতে পারে।

আমি কি আছে:

আমি এখনও ধারণার বাইরে, একটি হালকা প্রয়োজন। এটি করার জন্য অন্য একটি স্ক্রিপ্ট তৈরি করার বিষয়ে ভাবনা।

উত্তর:


10

একটি awkসমাধান:

$ awk '$0 == "UNIX" {i=1;next};i && i++ <= 2' file
Test 5
Test 6

ব্যাখ্যা

  • /^UNIX$/{i=1;next}: যদি আমরা দেখতে পাই UNIX, আমরা i = 1পরবর্তী ইনপুটটিতে প্রক্রিয়াকরণ পরিবর্তনশীল সেট করি ।

  • যদি ভেরিয়েবল iসেট করা থাকে (যার অর্থ আমরা দেখেছি UNIX), i && i++ <= 2কেবলমাত্র পরের দুটি লাইনে সত্য মানের কাছে মূল্যায়ন করা হয় UNIX, যার ফলে awkসম্পাদিত ডিফল্ট ক্রিয়া ঘটে print $0।

  • দেখার আগে UNIX, iসংজ্ঞায়িত করা হয়নি এবং পরে তৃতীয় লাইনে শুরু হয়েছিল UNIX, iএর মান 2 এর চেয়ে বেশি ছিল যা অভিব্যক্তিটিকে i && i++ <= 2মিথ্যা হিসাবে মূল্যায়ন করে, যার ফলে awkকিছুই হয় না।


পরীক্ষার পরে আপনি এই ত্রুটি বার্তাটি পেয়ে যাচ্ছেন সমাধান করুন: লাইন 1 এর নিকটে ত্রুটি সিনস্ট্যাক্স 1 টি লাইনের কাছে জামিন দিচ্ছে
— শীত

@ কুল: আপনি কি চালিয়েছেন? দয়া করে মনে রাখবেন যে $আমার উত্তরের শুরুতে সাইনটি শেল প্রম্পট, awkকমান্ডের অংশ নয় ।
— cuonglm

আর একটি রূপ:awk '/^UNIX$/ {s=NR;next} s && NR<=s+2'
— মুসফিল

আমি জানি যে @cuonglm
— শীত

@ কুল্ড: আপনার ওএস কী?
— cuonglm

12

একটি grepসমাধান:

grep -A2 -P '^UNIX$' file

ব্যাখ্যা: -A অর্থ: ম্যাচের পরের দুটি লাইন মুদ্রণ করুন

অথবা awk:

awk '$0=="UNIX"{getline; print; getline; print}' file

ব্যাখ্যা: এই বিবৃতিটি ইউনিক্সের জন্য ( $0=="UNIX") লাইনে অনুসন্ধান করে । যদি এটি দেওয়া হয় তবে এটি পরের অংশে তার বাফারে ( getline) প্রবেশ করে এবং বাফার ( ) মুদ্রণ করে print। এটি দুইবার করা হয়।

বা ব্যবহার করুন sed:

sed -n '/^UNIX$/{n;p;n;p}' file

ব্যাখ্যা: ইউনিক্সের জন্য এটি সমুদ্র সৈকত ( /^UNIX$/)। যদি এটি পাওয়া যায় তবে এটিতে অংশটি txecutes করে {...}। nএর অর্থ পরবর্তী, pমুদ্রণ। এটি পাশাপাশি দ্বিগুণ করা হয়।


ধন্যবাদ @ চাওস, আপনার দেওয়া শেষ 2 টি বিকল্পটি চেষ্টা করব। প্রতিটি বিকল্পের কিছু ব্যাখ্যা সংযোজন করুন, আমি সম্মতি জানাতে চাই এবং করব।
— শীতল

যদি লাইনের সংখ্যা পরিবর্তন হয় তবে শেষ দুটি বিকল্পে আমি কতগুলি পরিবর্তন করব? ধন্যবাদ
— শীতল

@ কুল আমার সম্পাদনা দেখুন। লাইনগুলি বিবৃতিতে অংশটি বা বিবৃতিতে getline; print;অংশটি পুনরাবৃত্তি করে তবে সংখ্যাটি পরিবর্তন করতে । awkn;p;sed
— বিশৃঙ্খলা

ধন্যবাদ @ চাওস, তবে লাইনের সংখ্যা বেশি হওয়ায় অভিব্যক্তি বৃদ্ধি পেয়েছে এবং পরিবর্তনটি আমার মতে সম্ভবপর নয়। আপনি কি মনে করেন না? যদি 100 লাইন?
— শীত

@ কোল্ড তারপরে আমি গ্রেপ সমাধানটি সাথে ব্যবহার করব grep -A100 -P '^UNIX$' file | tail -n +2। লেজের অংশটি প্রথম লাইন অপসারণ করা হয়। অন্যগুলিতে (সেড, অ্যাডক) আপনাকে লুপগুলি লিখতে হবে যা এটিকে কম সহজ করে তোলে।
— বিশৃঙ্খলা

4
grep -A 2 UNIX file.txt

গ্রেপের মানচিত্রটি বিকল্পটি এভাবে বর্ণনা করে:

  -A NUM, --after-context=NUM
      Print NUM  lines  of  trailing  context  after  matching  lines.
      Places  a  line  containing  --  between  contiguous  groups  of
      matches.

হাই @ টিউঙ্কলস, ভাল উত্তর, তবে আমার গ্রেপের কাছে এই বিকল্পগুলি "hblcnsviw" রয়েছে। তবে লজিক্স ভাল। ধন্যবাদ
— শীত

এটি আউটপুটেও মুদ্রণ করবে UNIX।
— cuonglm

বর্জন করতে UNIX, এটা নল থেকে tail: [...] | tail -n +1, অথবা sed: [...] | sed '1d'।
— ডোপঘোতি

1
@ ডপোগোতি: আপনার tailএবং sed '1d'পরামর্শগুলি UNIXকেবলমাত্র ইনপুট পাঠ্যে একবার প্রদর্শিত হলে সঠিকভাবে কাজ করে । অন্যান্য সমস্ত উত্তর একাধিক ঘটনার জন্য অনুমতি দেয়। এটি পরামর্শ দেওয়া ভাল হতে পারে ... | grep -v UNIX। বোঝা যাচ্ছে যে নেতারা, এই নোংরা পায় যদি UNIXলাইন 15 এবং উপস্থিত হয় 17
— জি-ম্যান 'পুনর্বহাল মনিকা' বলে

ভাল দিক. আমি নিশ্চিত যে এটি কেবল sedকিছু ফর্মের সাথে সম্পন্ন করা যেতে পারে sed '/UNIX/d;n;n;p/' /path/to/file, যা আমি সাসসেট হয়ে উত্তর হিসাবে জমা দিয়েছিলাম।
— ডোপঘোটি 21

0

এটি কৌশলটি সুন্দরভাবে করতে পারে বলে মনে হচ্ছে:

sed -n '/UNIX/{n;p;n;p}' /path/to/file

ধারণার প্রমাণ:

$ for i in {1..9}; do echo $i; done | sed -n '/4/{n;p;n;p}'
5
6

1
আপনার forলুপের চারপাশের সাব-শেল প্রয়োজনীয় নয়।
— পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

আসলে তা নয়; দিনের প্রথম দিকে এটি শেলটির মাঝে আমি ছিলাম এমন অন্য কিছু অবাস্তবতার একটি অংশ। পেরেনস সরানো হয়েছে।
— ডোপঘোটি

0

আপনি ব্যবহার করতে পারেন ex:

ex -s +'1,/UNIX/d|%p|q!' file_or_/dev/stdin

কোথায়:

  • 1,/UNIX/d- ম্যাচের পরে পাঠ্য সরিয়ে দেয়
  • %p - প্রিন্ট বাফার
  • q!- ফাইলের পরিবর্তনগুলি সংরক্ষণ না করেই প্রস্থান করুন ( wqজায়গায় জায়গায় সম্পাদনা করার জন্য ব্যবহার করুন)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.