একটি বিভাগে শুরু করতে আমার গ্রেপের সাহায্য দরকার need


8

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

green
blue
cyan
magenta
purple
brown
yellow
red
orange
more orange
more blue
this is enough

উত্তর:


9

এডাব্লু কে ব্যবহার AWK- এটি যতটা সহজ তা পেতে পারে:

awk '/yellow/,0' textfile.txt

নমুনা রান

$ awk '/yellow/,0' textfile.txt                                
yellow
red
orange
more orange
more blue
this is enough

grep

ম্যাচের পরে কিছু পরিমাণ লাইন মুদ্রণের জন্য আপনি বিকল্পের grepসাহায্যেও ব্যবহার করতে পারেন--after-context

grep 'yellow' --after-context=999999  textfile.txt

প্রসঙ্গের স্বয়ংক্রিয় সেটিংয়ের জন্য, আপনি ব্যবহার করতে পারেন $(wc -l textfile.txt)। মূল ধারণাটি হ'ল যদি আপনার ম্যাচ হিসাবে খুব প্রথম লাইন থাকে এবং আপনি সেই ম্যাচের পরে সমস্ত কিছু মুদ্রণ করতে চান তবে আপনাকে ফাইল বিয়োগে লাইনটির --after-contextসংখ্যা জানতে হবে 1 ভাগ্যক্রমে, সংখ্যার বিষয়ে ত্রুটি ছুঁড়ে ফেলবে না লাইনগুলি, যাতে আপনি এটি পুরোপুরি পরিসীমা ছাড়িয়ে নম্বরটি দিতে পারেন, তবে আপনি যদি এটি জানেন না তবে মোট রেখার সংখ্যাটি করবে will

$ grep 'yellow' --after-context=$(wc -l < textfile.txt) textfile.txt
yellow
red
orange
more orange
more blue
this is enough

আপনি ছোট করতে কমান্ড চান --after-contextহিসাবে একই বিকল্প -Aএবং $(wc -l textfile.txt), ফাইল নাম অনুসারে লাইন সংখ্যা প্রসারিত হবে। সুতরাং আপনি textfile.txtকেবল একবার টাইপ করুন

grep "yellow" -A $(wc -l textfile.txt)

পাইথন

skolodya@ubuntu:$ ./printAfter.py textfile.txt                                 
yellow
red
orange
more orange
more blue
this is enough

DIR:/xieerqi
skolodya@ubuntu:$ cat ./printAfter.py                                          
#!/usr/bin/env python
import sys

printable=False
with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
           printable=True
        if printable:
           print line.rstrip('\n')

অথবা বিকল্পভাবে printableপতাকা ছাড়াই

#!/usr/bin/env python
import sys

with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
          for lines in f: # will print remaining lines
             print lines.rstrip('\n')
          exit()

আপনি grepআদেশটি সহজ করতে পারেন grep "yellow" -A $(wc -l textfile.txt)
বাইট কমান্ডার

@ বাইটকম্যান্ডার হ্যাঁ, পাশাপাশি করা যেতে পারে। স্বচ্ছতার জন্য স্রেফ পুরো বিকল্পটি ব্যবহার করেছেন
সের্গেই কলডিয়াজহনি

1
@ বিটকম্যান্ডার কি সুন্দর হ্যাক। দুর্ভাগ্যক্রমে এটি কেবলমাত্র কাজ করে কারণ ফাইলের নামে কোনও স্থান নেই।
ক্যাস্পার্ড

@ ক্যাস্পার্ড ওহ হ্যাঁ, আপনি ঠিক বলেছেন। সেক্ষেত্রে আপনাকে সার্গের আসল কমান্ডে ফিরে যেতে হবে grep "yellow" -A $(wc -l < "my colors.txt") "my colors.txt"
বাইট কমান্ডার

5

আপনি এটি দ্বারা এটি করতে পারেন:

awk '/yellow/{f=1}f' file

যেখানে "ফাইল" হল সেই ফাইলের নাম যা আপনার পাঠ্যকে ধারণ করে।


দুর্দান্ত
মনগুলি

5

না grep, তবে ব্যবহার করে sed:

sed -n '/^yellow$/,$p' file
  • -n: মুদ্রণ বাধা দেয়
  • /^yellow$/,$: অ্যাড্রেস রেঞ্জ যা yellowসর্বশেষ লাইনের অন্তর্ভুক্তের সাথে মিলিত কোনও লাইনের প্রথম উপস্থিতি থেকে যায়
  • p: ঠিকানা সীমাতে লাইনগুলি মুদ্রণ করে
% sed -n '/^yellow$/,$p' file
yellow
red
orange
more orange
more blue
this is enough

5

পার্টিতে দেরী :)

ব্যবহার grep:

grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
  • -P পার্ল সামঞ্জস্যপূর্ণ রেজেক্স ব্যবহার করতে আমাদের সক্ষম করে

  • -z ইনপুট ফাইলকে ASCII NUL দ্বারা পৃথক করে তোলে, পরিবর্তে সেই নতুন লাইন

  • -o শুধুমাত্র কাঙ্ক্ষিত অংশ নেয়

  • (?s)ডটল সংশোধক, টোকেন .(যে কোনও চরিত্র) ব্যবহার করে আমাদেরকে নতুন লাইন মেলাতে সক্ষম করে

  • ইন \n\K, \nএকটি নতুন লাইন \Kমেলে, ম্যাচটি বাতিল করে

  • yellow\n.*yellowএকটি নতুন লাইন অনুসরণ করে ম্যাচগুলি এবং এর পরে সমস্ত কিছু খুব বাছাই করা হয় এবং আউটপুটে প্রদর্শিত হয়।

উদাহরণ:

% grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
yellow
red
orange
more orange
more blue
this is enough

অল্প ব্যবহার python:

#!/usr/bin/env python2
with open('file.txt') as f:
    lines = f.readlines()
    print ''.join(lines[lines.index('yellow\n'):])
  • lines ফাইলের সমস্ত লাইন সমন্বিত তালিকাটি (নতুন লাইনের পিছনেও রয়েছে)

  • lines.index('yellow\n')linesযেখানে yellow\nপাওয়া যায় তার সর্বনিম্ন সূচি দেয়

  • lines[lines.index('yellow\n'):]অংশটি শুরু থেকে yellow\nশেষ পর্যন্ত পেতে তালিকাগুলি তালিকা ব্যবহার করবে

  • join স্ট্রিং হিসাবে আউটপুট তালিকার উপাদানগুলিতে যোগদান করবে


চমৎকার, তবে আপনাকে উল্লেখ করতে হবে যে পাইথন কোডটি কেবল "ল্যাভ" এর সমান সম্পূর্ণ রেখাগুলি খুঁজে পায়, এটি "আরও হলুদ" এর মতো উদাহরণগুলি সনাক্ত করে না।
বাইট কমান্ডার

@ বাইটকম্যান্ডার ওপির উদাহরণ থেকে আমি স্পষ্ট মনে করি যে তারা কেবল yellowলাইনে মিলতে চায়..ও যদি এটি না হয় তবে আমাদের python
কারও অ্যালগো

হ্যা অবশ্যই. এটি যাইহোক সমালোচনা ছিল না, উত্তরটি উন্নত করার জন্য কেবল একটি ইঙ্গিত। অন্য যে কেউ এটি পড়তে পারে তা ধরে নিতে পারে যে কোডটি কাজ করে grepএবং কেবলমাত্র সম্পূর্ণ লাইনের সাথে মেলে না। আমি বিটিডব্লিউ upvated।
বাইট কমান্ডার

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