আমি কীভাবে কোনও ফাইলের সাথে মিলে যাওয়া লাইনগুলি, এবং মেলানো লাইনগুলিকে অন্য কোনও ফাইলে পুনর্নির্দেশ করতে পারি?


13

নীচের প্রয়োজনীয়তার জন্য ইতিমধ্যে অনুকূলিত উপায়ে কোনও স্ক্রিপ্ট / প্রোগ্রাম / ইউটিলিটি উপলব্ধ?

someCommand |
   tee >(grep "pattern" > LinesWhichMatch) |
   grep -v "pattern" > LinesWhichDoesNotMatch

উত্তর:


16

আপনি awkযে জন্য ব্যবহার করতে পারেন ।

command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'

1
আমি পুরোপুরি পরিচিত নই awkতবে এটি কোন মুহুর্তে মূল্যায়ন করে >? শর্তসাপেক্ষে প্রযোজ্য প্রতিবার যদি এটি মূল্যায়ন করা হয় তবে আপনি দুটি এক-লাইন ফাইল দিয়ে শেষ করতে চান ...
শাদুর

1
@ শাদুর >বিদ্যমান ফাইলগুলি ওভাররাইট করে ফাইলটিতে সমস্ত আউটপুট প্রিন্ট করে। এটি এমনভাবে মূল্যায়ন করা হয় না যে এর ফলে কোনও নতুন লাইন একই উদাহরণ থেকে পুরানো আউটপুটকে ওভাররাইট করে awk। অর্থাৎ, যদি সেখানে একাধিক মিল নেই, ফাইল "ম্যাচ" প্রতিটি ম্যাচ দিয়ে আলাদা করা থাকতে হবে OFS। বিদ্যমান ফাইলগুলির চিকিত্সার মধ্যে পার্থক্য >এবং >>বিদ্যমান।
ক্রিস ডাউন

10

এখানে একটি sedউদাহরণ রয়েছে:
দ্রষ্টব্য: সিডের wকমান্ডটি স্ক্রিপ্টটি চালানোর সময় একটি বিদ্যমান ফাইলকে ওভাররাইট করবে, তবে কেবলমাত্র সেই নির্দিষ্ট লিখিত কমান্ড ট্রিগার করা হলে; অত: পরrm

rm -f file-{yes,not}  
sed -ne '/pattern/bY; w file-not' -e 'b; :Y; w file-yes' file

খুশী হলাম। শাখা ছাড়াই:sed -n '/PATTERN/p;//! w file-not' infile >file-yes
don_crissti

6

আপনি জোর করে ফাইল যুক্ত করতে পারেন:

awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }

বা সংক্ষিপ্ত:

awk '{print >>(/pattern/?"matched":"unmatched")}'

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