"Ungrep" - যা নিদর্শন মেলে না


13

নিম্নলিখিতগুলি করার জন্য আমি কোনও আদেশ বা স্ক্রিপ্ট খুঁজছি - প্রদত্ত:

file1.txt:

abcd
efgh 
ijkl
mnop

file2.txt:

123abcd123
123efgh123
123mnop123

আমি একটি আদেশ চাই যা এরকম কিছু করে:

ungrep file1.txt file2.txt

এবং নিম্নলিখিতগুলি প্রদান করে:

ijkl

অন্য কথায় এটি আমাকে ফাইল 1.txt এ লাইন দিচ্ছে যা ফাইল 2.txt এর গ্রেপ-এ কোনও ফল দেয় না। আমি জানি যে আমি ফাইল1.txt এর মাধ্যমে পুনরাবৃত্তি করে, প্রতিটি লাইনের জন্য ফাইল 2.txt গ্রেপ করে এবং ফলাফলটি সংরক্ষণ করে এবং ফলাফলটি খালি আছে এমন যে কোনও লাইন আউটপুট করেছিলাম, তবে আমি এটি করার জন্য আরও দক্ষ পদ্ধতির প্রত্যাশা করছিলাম।

উত্তর:


18

GNU grepএর সাথে নিম্নলিখিতগুলির কাজ করা উচিত। -fবিকল্পটি ব্যবহার করে , file1.txt"প্যাটার্ন ফাইল" হিসাবে পাস করুন - তবে এটি দ্বিতীয়বারের মতো একটি ডেটা ফাইল হিসাবেও পাস করুন। -oশুধুমাত্র মিলে যাওয়া অংশগুলি রিপোর্ট করতে ব্যবহার করুন । অবশেষে সেই শব্দগুলি বের করে যা কেবল একবারই মিলবে - এগুলি file1.txtকোনও মিল খুঁজে পায় না এমন লাইনগুলির সাথে মিলে file2.txt

grep -h -o -f  file1.txt file2.txt file1.txt | sort | uniq -u
ijkl

খুব ভাল বর্ণনা। ধন্যবাদ এবং +1।
আনটনাট

4
আপনি গ্রেপ কৌতুক ছাড়াই একই প্রভাব অর্জন করতে পারেন: sort file1.txt <(grep -of file1.txt file2.txt) | uniq -uতবে, আপনার সমাধানের মতো, এটি কেবল তখনই কাজ করে যখন প্যাটার্ন ফাইলটিতে আসলে কোনও রেজেক্স মেটাচার্যাক্টর থাকে না।
ধনী

@rici, এটি একটি খুব ভাল পয়েন্ট
ইরুবার

2
উন্নতি:grep -oFf file1.txt file2.txt | sort file1.txt - | uniq -u
স্টাফেন চ্যাজেলাস

10

আপনি এটির awkমতো করে এটি করতে পারেন:

awk '
  NR == FNR {w[$0]; next}
  {for (i in w) if (index($0,i)) delete w[i]}
  END {for (i in w) print i}' file1.txt file2.txt

ব্যবহার করে index, আমরা নিয়মিত প্রকাশের সাথে মিল না দিয়ে সাবস্ট্রিংগুলি সন্ধান করছি।

কারণ আমরা কোনও মিল খুঁজে পাওয়ার সাথে সাথে অ্যারে থেকে শব্দটি মুছুন, আমরা অপ্রয়োজনীয় অনুসন্ধানগুলি এড়িয়ে চলি।


1
আমি কেবল এটি গ্রহণ করব। এটি কোনও ও (এন লগ এন) বাছাইয়ের আবেদন করে না এবং অদ্ভুতভাবে ব্যর্থ হয় না যখন প্যাটার্নগুলিতে রেইজেক্স মেটা-অক্ষর থাকে এবং রেজেক্সগুলিকে সমর্থন করার জন্য বাড়ানো যেতে পারে।
কাজ

আমি বিশ্বাস করতে পারি না যে কেবল মূল্যায়নের w[$0]অ্যারেতে কী যুক্ত করার পার্শ্ব প্রতিক্রিয়া রয়েছে।
কাজ

1
@ কাজ, হ্যাঁ এটি বিভ্রান্তিকর হতে পারে এবং আপনি অনেকগুলি স্ক্রিপ্টগুলি উদাহরণস্বরূপ if (a[$1])পরিবর্তে অজান্তেই অ্যারে উপাদানগুলি বরাদ্দ না করে দেখতে পান if ($1 in a)। এটি awkআসল awkএবং প্রতিটি সহ প্রতিটি ক্ষেত্রে nawk, তবে গতকাল মানটির দিকে তাকিয়ে, আমি এটি নির্দিষ্ট করে দেখতে পেলাম না।
স্টাফেন চেজেলাস

1
@Kaz এখানে POSIX উদ্ধৃতি আছে: "অ্যাপ্লিকেশন নিশ্চিত করতে হবে যে সঙ্গে ব্যবহার একটি মাল্টি-dimensioned সূচক মধ্যে অপারেটর আলাদা করা হয়। এর মধ্যে অপারেটর, যা একটি বিশেষ অ্যারের উপাদান অস্তিত্বের পরীক্ষা কারণ যে উপাদান অস্তিত্ব করবে না কোন। কোন অস্তিত্বযুক্ত অ্যারে উপাদানগুলির অন্যান্য রেফারেন্স এটিকে স্বয়ংক্রিয়ভাবে তৈরি করবে "" এখান থেকে দু'একটি অনুচ্ছেদে স্ক্রোল করে এটি পাওয়া যাবে
jw013

1
যতক্ষণ file1না বিশাল (বিশাল কিছু মূল্যের জন্য) না হয়, ততক্ষণ আমি এই সমাধানটি পছন্দ করতাম কারণ এর জন্য কোনও ধরণের বাছাইয়ের প্রয়োজন হয় না file2এবং আশা করা যায় যে এটি আরও দক্ষ হবে।
jw013
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.