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


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.