একটি নির্দিষ্ট শব্দ হ'ল এন বারের সাথে পুনরাবৃত্তি করা হলে আমি কীভাবে লাইন পেতে পারি?


8

এই প্রদত্ত ইনপুট জন্য:

How to get This line that this word repeated 3 times in THIS line?
But not this line which is THIS word repeated 2 times.
And I will get This line with this here and This one
A test line with four this and This another THIS and last this

আমি এই আউটপুট চাই:

How to get This line that this word repeated 3 times in THIS line?
And I will get This line with this here and This one

পুরো লাইনগুলি পেতে কেবল তিনটি "এই" শব্দটি রয়েছে repeated (কেস সংবেদনশীল ম্যাচ)


4
খুব বিস্তৃত ভোটারদের কাছে: কীভাবে একটি প্রশ্ন সম্ভবত আরও নির্দিষ্ট হতে পারে?
জ্যাকব Vlijm

@ জ্যাকবভিলিজম এটিতে "খুব বেশি সম্ভাব্য উত্তর" রয়েছে। বাছুন $RANDOM_LANGUAGE- কেউ এর সমাধান নিয়ে আসতে সক্ষম হবে।
মারু

@ মুরু আমি এর বিপরীতে বলব, এটিকে একটি ভাষায় সীমাবদ্ধ করা এটি একটি প্রোগ্রামিং (ভাষা) কেন্দ্রিক প্রশ্নে পরিণত করবে। এখন এটি একটি সমস্যা কেন্দ্রিক প্রশ্ন। অনেকগুলি সম্ভাব্য সমাধান (ভাষা) রয়েছে, তবে এতগুলি সুস্পষ্ট।
জ্যাকব Vlijm

উত্তর:


13

ইন perl, thisসংবেদনশীলতার সাথে নিজেকে প্রতিস্থাপন করুন এবং প্রতিস্থাপনের সংখ্যা গণনা করুন:

$ perl -ne 's/(this)/$1/ig == 3 && print' <<EOF
How to get This line that this word repeated 3 times in THIS line?
But not this line which is THIS word repeated 2 times.
And I will get This line with this here and This one
A test line with four this and This another THIS and last this
EOF
How to get This line that this word repeated 3 times in THIS line?
And I will get This line with this here and This one

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

perl -ne 'my $c = () = /this/ig; $c == 3 && print'

আপনার যদি জিএনইউ অ্যাড থাকে তবে খুব সহজ উপায়:

gawk -F'this' -v IGNORECASE=1 'NF == 4'

পৃথককারী সংখ্যার চেয়ে ক্ষেত্রের সংখ্যা আরও এক হবে।


কেন প্রতিস্থাপন? আমরা সরাসরি এটি প্রতিস্থাপন ছাড়া গণনা করতে পারি?
нιηসнιη

প্রকৃতপক্ষে আমরা গণনা করতে পারি, কোডটি কিছুটা লম্বা: স্ট্যাকওভারফ্লো
প্রশ্নগুলি

গভাক কমান্ডের জন্য আপভোট করুন।
শ্রী

9

ধরে নেওয়া আপনার উত্স ফাইলটি tmp.txt,

grep -iv '.*this.*this.*this.*this' tmp.txt | grep -i '.*this.*this.*this.*'

বাম গ্রেপ সমস্ত লাইনকে আউটপুট করে যা tmp.txt এ "এটি" এর 4 বা ততোধিক কেস-সংবেদনশীল ঘটনাগুলি না করে।

ফলাফলটি ডান গ্রেপগুলিতে পাইপ করা হয়, যা বাম গ্রেপের ফলাফলের 3 বা ততোধিক ঘটনা সহ সমস্ত লাইনকে আউটপুট করে।

আপডেট: @ মুরুকে ধন্যবাদ, এই সমাধানের আরও ভাল সংস্করণ এখানে রয়েছে,

grep -Eiv '(.*this){4,}' tmp.txt | grep -Ei '(.*this){3}'

n + 1 দিয়ে 3 এবং n এর সাথে 3 প্রতিস্থাপন করুন।


এটি এন> ৪ এর জন্য ব্যর্থ হবে And এবং প্রথমটি grepশেষ হওয়া দরকার *
PS95

1
আমি আপনাকে এই এন = 50 জন্য লিখতে পারি না গড় এবং তাই আপনার আর, grep যা সব আউটপুট কম ধারণকারী বা দুই সমান বর্জন প্রয়োজন প্রশ্ন ঠিক তিন জন্য thisgrep -iv '.*this.*this.*this.*this.*' tmp.txt | grep -i '.*this.*this.*this.* |grep -iv '.*this.*this.'
PS95

@ prakharsingh95 এটি এন> ৪ এর জন্য ব্যর্থ হয়নি এবং প্রথম গ্রেপ এর প্রয়োজন নেই।
শ্রী

1
@ কাসিয়া আমার উত্তর আপনি কী নিচ্ছেন?
শ্রী

5
এটিকে কিছুটা সরল করুন: grep -Eiv '(.*this){4,}' | grep -Ei '(.*this){3}'- এটি এন = 50 এর জন্য এটি ব্যবহারিক করে তুলতে পারে।
মুরু

9

অজগর, এটি কাজ করবে:

#!/usr/bin/env python3

s = """How to get This line that this word repeated 3 times in THIS line?
But not this line which is THIS word repeated 2 times.
And I will get This line with this here and This one
A test line with four this and This another THIS and last this"""

for line in s.splitlines():
    if line.lower().count("this") == 3:
        print(line)

আউটপুট:

How to get This line that this word repeated 3 times in THIS line?
And I will get This line with this here and This one

বা যুক্তি হিসাবে ফাইল সহ কোনও ফাইল থেকে পড়তে:

#!/usr/bin/env python3
import sys

file = sys.argv[1]

with open(file) as src:
    lines = [line.strip() for line in src.readlines()]

for line in lines:
    if line.lower().count("this") == 3:
        print(line)
  • স্ক্রিপ্টটি একটি ফাঁকা ফাইলে আটকে দিন, এটি সংরক্ষণ করুন, find_3.pyআদেশ দ্বারা এটি চালান:

    python3 /path/to/find_3.py <file_withlines>
    

অবশ্যই "এই" শব্দটি অন্য কোনও শব্দ (বা অন্যান্য স্ট্রিং বা লাইন বিভাগ) দ্বারা প্রতিস্থাপন করা যেতে পারে, এবং লাইন প্রতি সংঘটন সংখ্যাটি লাইনের অন্য কোনও মানকে সেট করা যেতে পারে:

    if line.lower().count("this") == 3:

সম্পাদন করা

ফাইলটি যদি বড় হত (কয়েক হাজার / মিলিয়ন লাইন), নীচের কোডটি দ্রুত হবে; এটি একবারে ফাইল লোড করার পরিবর্তে প্রতি লাইনে ফাইলটি পড়ে:

#!/usr/bin/env python3
import sys
file = sys.argv[1]

with open(file) as src:
    for line in src:
        if line.lower().count("this") == 3:
            print(line.strip())

আমি পাইথন বিশেষজ্ঞ নই, ফাইল থেকে কীভাবে পড়ব? ধন্যবাদ
সнιη

1
যুক্তি হিসাবে ফাইলটি ব্যবহার করতে @ ক্যাসিয়াএ সম্পাদিত।
জ্যাকব Vlijm

শুধু কৌতূহলী: আপনি দ্বিতীয় কোড স্নিপেটে কেন জেনারেটর ব্যবহার করেন নি?
মুড়ু

6

এর জন্য আপনি কিছুটা খেলতে পারেন awk:

awk -F"this" 'BEGIN{IGNORECASE=1} NF==4' file

এটি ফিরে আসে:

How to get This line that this word repeated 3 times in THIS line?
And I will get This line with this here and This one

ব্যাখ্যা

  • আমরা যা করি তা হল ফিল্ড বিভাজককে thisনিজের কাছে সংজ্ঞায়িত করা । এভাবে, শব্দটি thisপ্রদর্শিত হওয়ার সাথে সাথে লাইনে অনেকগুলি ক্ষেত্র +1 থাকবে ।

  • এটি কে সংবেদনশীল করার জন্য, আমরা ব্যবহার করি IGNORECASE = 1। রেফারেন্স দেখুন: ম্যাচ করার ক্ষেত্রে কেস সংবেদনশীলতা

  • তারপরে, এই তিনটি NF==4লাইন thisঠিক তিনবার পাওয়ার জন্য এটি কেবল বলার মতো বিষয় । আর কোনও কোডের প্রয়োজন নেই, যেহেতু {print $0}(যেটি হ'ল বর্তমান লাইনটি মুদ্রণ করা হয়) awkযখন কোনও এক্সপ্রেশন মূল্যায়ন করে তার ডিফল্ট আচরণ True



@ মুরু ওহ, আমি দেখিনি! আমার ক্ষমা এবং আপনার জন্য +1
ফেডোরকুই

5

ধরে নিচ্ছি যে নামক কোনও ফাইলটিতে রেখাগুলি সঞ্চিত রয়েছে FILE:

while read line; do 
    if [ $(grep -oi "this" <<< "$line" | wc -w)  = 3 ]; then 
        echo "$line"; 
    fi  
done  <FILE

1
আপনাকে ধন্যবাদ, আপনি আপনার sed ...আদেশটি সরিয়ে ফেলতে পারেন এবং পরিবর্তে -oবিকল্প যুক্ত করতে পারেন grep -oi ...
нιηসнιη

সহজ:$(grep -ic "this" <<<"$line")
muru

2
@ মুরু না, -cবিকল্পটি প্রতিটি লাইনে "এই" শব্দের সংখ্যার সাথে "এই" শব্দের সাথে মেলে এমন লাইনগুলির সংখ্যা গণনা করবে ।
нιηসнιη

1
@ কাসিয়া আঃ, হ্যাঁ আমার খারাপ।
মুড়ু

@ কাসিয়া, এই ক্ষেত্রে -lএবং -wসমতুল্য হবে না ?
PS95

4

আপনি যদি ভিমে থাকেন:

g/./if len(split(getline('.'), 'this\c', 1)) == 4 | print | endif

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


ভিম ব্যবহার করার সময় শব্দের n টি সংঘটন সহ লাইনগুলি অনুসন্ধান করার জন্য দুর্দান্ত উদাহরণ example
শ্রী

0

রুবি ওয়ান-লাইনার দ্রবণ:

$ ruby -ne 'print $_ if $_.chomp.downcase.scan(/this/).count == 3' < input.txt                                    
How to get This line that this word repeated 3 times in THIS line?
And I will get This line with this here and This one

একটি বেশ সহজ ফ্যাশন ওয়ার্কস: আমরা রুবি এর stdin মধ্যে ফাইল পুনর্নির্দেশ, রুবি, stdin থেকে লাইন পায় এটি আপ সাফ করে দিয়ে chompএবং downcase, এবং scan().countআমাদের একটি সাবস্ট্রিং ঘটনার সংখ্যা দেয়।

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