Awk কমান্ডটি দিয়ে শুরু করুন END


13

অ্যাজ ম্যানুয়াল অনুসারে, বিগইন এবং এন্ডটি ইনপুট মেলানোর জন্য ব্যবহার করা হয় না, বরং স্টার্ট-আপ এবং অ্যাডক স্ক্রিপ্টে ক্লিন-আপ সম্পর্কিত তথ্য সরবরাহ করতে ব্যবহৃত হয়। এখানে দেওয়া উদাহরণ:

ls -l | \
awk 'BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }'
Files found:
amd.conf
antivir.conf
xcdroast.conf
xinetd.conf

প্রথমে এটি আউটপুট থেকে একটি স্ট্রিং প্রিন্ট করে। তারপরে এটি কোনও প্যাটার্ন ম্যাচের জন্য ইনপুট চেক করে, যেখানে ইনপুটটি একটি বা x এর পরে কোনও অক্ষর অনুসরণ করে বা একাধিকবার .conf অনুসরণ করে। যে কোনও মিলের জন্য নবম কলামটি মুদ্রিত।

যে বিষয়টি আমাদের ব্যবহার করতে বাধ্য করা হয়েছে তা এখানেই শুরু হয়, এর অর্থ কি বিশুদ্ধ কেবলমাত্র একটি প্রিন্ট ফাংশনই ব্যবহার করতে পারে যার মধ্যে একটি শুরু বা শেষ থাকে? যদি তা না হয়, তবে কেন আমরা শুরুতে মুদ্রণ ফাংশনটি কী শুরু করে মূল শব্দটি শুরু করতে পারি না? মনে হচ্ছে বিগইন অতিমাত্রায়।


কেবল বিগইন ছাড়াই কমান্ড চালানো আপনার প্রশ্নের উত্তর দেবে, এটি দেখায় যে এটি অতিমাত্রায় নয় এবং আপনি আলাদা ফলাফল পেতে পারেন।
এমএসবি

উত্তর:


11

BEGINঅতিরিক্ত নয়। আপনি যদি নির্দিষ্ট না BEGINকরেন printতবে ইনপুটটির প্রতিটি লাইনের জন্য কার্যকর করা হবে।

ম্যানুয়াল থেকে উদ্ধৃতি :

BEGINপ্রথম ইনপুট রেকর্ডটি পড়ার আগে একবারেই কোনও নিয়ম কার্যকর করা হয়। একইভাবে, ENDসমস্ত ইনপুট পড়ার পরে কেবল একবারই একটি নিয়ম কার্যকর করা হয়।

$ seq 5 | awk 'BEGIN{print "Hello"}/4/{print}'   # Hello printed once
Hello
4
$ seq 5 | awk '{print "Hello"}/4/{print}'        # Hello printed for each line of input
Hello
Hello
Hello
Hello
4
Hello
$

7

awkদেহ এবং ব্লক ব্যতীত প্রদত্ত এক্সপ্রেশনগুলির জন্য ইনপুটটির প্রতিটি লাইন প্রক্রিয়া করে । এবং ব্লকের ক্ষেত্রে, ইনপুট প্রসেসিং শুরু হওয়ার আগে এবং ইনপুট প্রক্রিয়াজাতকরণ যথাক্রমে সম্পন্ন হওয়ার আগে একবারেই বিবৃতিগুলি প্রক্রিয়া করবে। ব্লক ব্যতীত , আপনি কেবল শিরোনামের মতো এককালীন তথ্য মুদ্রণ করতে সক্ষম হবেন না, আপনি শরীরের জন্য প্রয়োজনীয় কিছু ভেরিয়েবলের দক্ষতার সাথে আরম্ভ করতে সক্ষম হবেন না। এছাড়াও, এফওয়াইআই, একটি প্রোগ্রামে একাধিক এবং ব্লক থাকতে পারে।BEGINENDBEGINENDawkBEGINawkBEGINEND


2

awkপ্যাটার্নটি মেলে তার আগে প্রতিটি ব্লক কার্যকর করে। খালি প্যাটার্ন (কেবল অবরুদ্ধ) প্রতিটি লাইনের সাথে মেলে। BEGINএবং ENDবিশেষ ধরণগুলির শুরুতে এবং ফাইলের শেষে (অর্থ অনুরূপ সাথে মেলে এমন ^এবং $অনুভূমিক দিক)।

আপনি যদি ফাইলটি পড়ার আগে কিছু কার্যকর করতে চান তবে ব্যবহার করুন BEGIN। উদাহরণস্বরূপ, কাউন্টার বা কোনও কিছুর সূচনা। ENDতারপরে ফলাফল সংগ্রহ করতে পারে।


0

প্রদত্ত উদাহরণে, যা আমার মনে হয় শিক্ষাগত স্পষ্টতার জন্য সরল করা হয়েছে, আপনি ঠিক বলেছেন যে এটি অতিমাত্রায়। আপনি ব্যবহার না করে একই ফলাফল পেতে পারে BEGIN

1 == NR            { print "Files found:\n" }
/\<[a|x].*\.conf$/ { print $9               }

মুদ্রণ বিবৃতিটি ইনপুটটির প্রথম লাইনে সীমাবদ্ধ থাকায় একই ফলাফল তৈরি করবে।

বলা হচ্ছে, BEGINএবং ENDব্লকগুলি অবিশ্বাস্যভাবে শক্তিশালী সরঞ্জাম are অন্যান্য সমাধান যেমন উল্লেখ করেছে, আপনি BEGINব্লকটি পরিবর্তনশীল বা অন্যান্য রুটিনগুলি সূচনা করতে ব্যবহার করতে পারেন যা কেবল একবার সম্পাদন করা প্রয়োজন তবে প্রক্রিয়া করার জন্য কোনও ফাইল নেই তখন অ্যাওউ কমান্ড চালাতে এটি ব্যবহার করা যেতে পারে। একটি সহজ উদাহরণ:

BEGIN { print sqrt(12/4) }

আপনি এখানে কোনও ইনপুট প্রক্রিয়াজাত না করে Awk এ প্রোগ্রামিংয়ের আরও গুরুতর উদাহরণ দেখতে পাচ্ছেন ।

তেমনি, ENDগণনা সম্পাদন এবং সমস্ত ইনপুট সংক্ষিপ্তকরণের জন্য ব্লকটি অত্যন্ত কার্যকর। সমস্ত তথ্য প্রথম না পড়ে এটি করা যায় না (সাধারণত)। সংক্ষিপ্ত ইনপুট একটি সাধারণ উদাহরণ এখানে পাওয়া যাবে

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