আমি কীভাবে ব্যাশ স্ক্রিপ্টে awk দিয়ে মাল্টি-লাইন রেকর্ডগুলি প্রক্রিয়া করতে পারি?


14

উদাহরণ.txt নীচে

Restaurant: McDonalds 
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

Restaurant: 5 guys
City: Atlanta
State: Georgia
Address: 123 Peachtree Rd
Phone: 911

Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911

আমি ব্যাশ স্ক্রিপ্ট ব্যবহার করছি এবং বলি যে আমি উপরের ফাইলটি থেকে একটি রেস্তোঁরাটির নামে অনুসন্ধান করতে চাই। রেস্তোঁরাটির নামের জন্য ব্যবহারকারীকে ইনপুট জিজ্ঞাসা করুন এবং সেই রেস্তোঁরা সম্পর্কিত তথ্য (5 লাইন) মুদ্রণ করা উচিত।

awk '/McDonalds/> /KFC/' example.txt

আমি জানি যে উপরের কোডের লাইনটি পুরো লাইনটি মুদ্রণ করবে যা "ম্যাকডোনাল্ডস" এবং "কেএফসি" এর সাথে মেলে তবে এটি কেবল পাঠ্য ফাইল থেকে প্রথম লাইনটি প্রিন্ট করবে তবে সেই রেস্তোঁরা সম্পর্কিত বাকী তথ্য নয়। রেস্তোরাঁর নামের ইউজার ইনপুট থেকে সমস্ত তথ্য (5 লাইন) মুদ্রণ করতে আমি কীভাবে এটি বলতে পারি?

উত্তর:


11

খালি সাথে, আপনি রেকর্ড বিভাজক পরিবর্তন করতে পারেন । ডিফল্টরূপে এটি একটি নতুন লাইন, সুতরাং ফাইলের প্রতিটি লাইন একটি রেকর্ড। আপনি যদি RSভেরিয়েবলটি খালি স্ট্রিংয়ে সেট করেন , খালি খালি রেখাগুলি দ্বারা রেকর্ডগুলি পৃথক করা বিবেচনা করবে:

awk -v name="KFC" -v RS="" '$0 ~ "Restaurant: " name' example.txt

আমি আপনার প্রশ্ন বুঝতে পারি না। এটা বেশ অস্পষ্ট। এটি কি কার্যনির্বাহী বা ব্যবহার আপনি পাবেন না?
গ্লেন জ্যাকম্যান

3

ব্যবহার sed:

$ sed -n '/KFC/,/^$/p' file
Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911

$ sed -n '/McDo/,/^$/p' file
Restaurant: McDonalds
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

ব্যাখ্যা

এটি বেসিক sedফাংশন, আপনি এসডের জন্য দরকারী এক-লাইন স্ক্রিপ্টগুলি উল্লেখ করতে পারেন

# print section of file between two regular expressions (inclusive)
sed -n '/Iowa/,/Montana/p'             # case sensitive

ব্যাখ্যা যোগ করুন।
বিএমডাব্লু

তবে প্রস্তাবিত সম্পাদনাটি কেন বাতিল? আমি উত্তরটি পরিবর্তন করিনি। আমি সবেমাত্র বিন্যাসে উন্নতি করেছি।
ডেইজি

2
$ awk '$2=="KFC" {print; for(i=1; i<=4; i++) { getline; print}}' example.txt

Restaurant: KFC
City: NYC
State: NY
Address: 123 Madison Square
Phone: 911

উপরের কমান্ডটি বর্তমান লাইনের পাশাপাশি পরপর 4 টি লাইন প্রিন্ট করবে এবং মুদ্রণ করবে কারণ এটি লুপের জন্য দেওয়া হয়েছিল search অনুসন্ধান প্যাটার্নটি $2=="KFC"একাধিক লাইন থেকে একটি নির্দিষ্ট লাইন পেতে সহায়তা করবে।


0

আর একটি সম্ভাব্য সমাধান:

awk 'BEGIN{FS="\n";RS="\n\n"}{if($1=="KFC")print $0}' example.txt

{if($1=="KFC")print $0}শুধু ঘনীভূত করা যাবে $1 == "KFC", যেহেতু একটি সত্য অবস্থার জন্য ডিফল্ট অ্যাকশন রেকর্ড প্রিন্ট হয়।
মুড়ু

0

আপনি যে নামটি চান তা সম্বলিত লাইন থেকে শব্দ যুক্ত শেষ লাইনে মুদ্রণ করা যথেষ্ট Phone(অবশ্যই মনে করা হয় যে সমস্ত এন্ট্রি একই ধরণের অনুসরণ করে এবং সর্বদা Phoneসমাপ্তি রেকর্ড হিসাবে থাকবে )

$> awk '/5 guys/,/Phone/' restaurants.txt                                     
Restaurant: 5 guys
City: Atlanta
State: Georgia
Address: 123 Peachtree Rd
Phone: 911
$> awk '/McDonalds/,/Phone/' restaurants.txt                                  
Restaurant: McDonalds 
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

আমরা যদি এটি কিছুটা জটিল করতে চাইতাম তবে আমরা ম্যাচের পরে ঠিক 5 টি লাইন মুদ্রণ করতে পারতাম:

awk '/McDonalds/{stop=NR+5}; NR<=stop ' restaurants.txt                    

Restaurant: McDonalds 
City: Miami
State: Florida
Address: 123 Biscayne Blvd
Phone: 911

stopপরিবর্তনশীল সেট হবে না, তাই NR<=stopকিছু প্রিন্ট হবে না, যতক্ষণ না /McDonalds/{stop=NR+5;}অংশ আসলে পরিবর্তনশীল সেট করে, এবং যে শুধুমাত্র ঘটবে যখন আমরা মিল খুঁজে।

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