awk কমান্ড টেক্সট ফাইল প্রক্রিয়াকরণ বা বিশ্লেষণের জন্য একটি শক্তিশালী পদ্ধতি। বিশেষ করে, এটি লাইন (সারি) এবং কলাম দ্বারা সংগঠিত ডেটা ফাইলগুলিকে বিশ্লেষণ করে। সাধারণ awk কমান্ড কমান্ড লাইন থেকে চালানো যেতে পারে। আরও জটিল কাজগুলিকে একটি ফাইলে awk প্রোগ্রাম (যাকে awk স্ক্রিপ্ট বলা হয়) হিসাবে লিখতে হবে৷
AWK বেসিক
একটি awk কমান্ডের মৌলিক বিন্যাস এইরকম দেখায়:
awk 'pattern {action}' input-file > output-file
এর অর্থ:ইনপুট ফাইলের প্রতিটি লাইন নিন; যদি লাইনে প্যাটার্ন থাকে, লাইনটিতে ক্রিয়া প্রয়োগ করুন এবং ফলাফলের লাইনটি আউটপুট ফাইলে লিখুন। যদি প্যাটার্নটি বাদ দেওয়া হয়, ক্রিয়াটি সমস্ত লাইনে প্রয়োগ করা হয়। যেমন:
awk '{ print $5 }' table1.txt > output1.txt
উপরের বিবৃতিটি প্রতিটি লাইনের 5 তম কলামের উপাদান নেয় এবং এটিকে আউটপুট ফাইল "output.txt" এ একটি লাইন হিসাবে লেখে। '$4' ভেরিয়েবলটি চতুর্থ কলামকে নির্দেশ করে। একইভাবে, আপনি $1, $2, $3 ইত্যাদি সহ প্রথম, দ্বিতীয় এবং তৃতীয় কলাম অ্যাক্সেস করতে পারেন। ডিফল্টরূপে, কলামগুলিকে স্পেস বা ট্যাব (তথাকথিত সাদা স্থান) দ্বারা পৃথক করা হয়েছে বলে ধরে নেওয়া হয়। সুতরাং, যদি ইনপুট ফাইল "table1.txt"-এ এই লাইনগুলি থাকে:
1, Justin Timberlake, Title 545, Price $7.30
2, Taylor Swift, Title 723, Price $7.90
3, Mick Jagger, Title 610, Price $7.90
4, Lady Gaga, Title 118, Price $7.30
5, Johnny Cash, Title 482, Price $6.50
6, Elvis Presley, Title 335, Price $7.30
7, John Lennon, Title 271, Price $7.90
8, Michael Jackson, Title 373, Price $5.50
তারপর কমান্ডটি "output1.txt" আউটপুট ফাইলে নিম্নলিখিত লাইনগুলি লিখবে:
545,
723,
610,
118,
482,
335,
271,
373,
যদি কলাম বিভাজক স্পেস বা ট্যাব ব্যতীত অন্য কিছু হয়, যেমন একটি কমা, তাহলে আপনি awk বিবৃতিতে নিম্নরূপ উল্লেখ করতে পারেন:
awk -F, '{ print $3 }' table1.txt > output1.txt
এটি প্রতিটি লাইনের কলাম 3 থেকে উপাদান নির্বাচন করবে যদি কলামগুলি একটি কমা দ্বারা পৃথক করা হয় বলে মনে করা হয়। তাই আউটপুট, এই ক্ষেত্রে, হবে:
Title 545
Title 723
Title 610
Title 118
Title 482
Title 335
Title 271
Title 373
AWK-তে শর্তসাপেক্ষ অভিব্যক্তি
কোঁকড়া বন্ধনীর ('{','}') ভিতরে বিবৃতির তালিকাকে ব্লক বলা হয়। আপনি যদি একটি ব্লকের সামনে একটি শর্তসাপেক্ষ অভিব্যক্তি রাখেন, তবে শর্তটি সত্য হলেই ব্লকের ভিতরের বিবৃতিটি কার্যকর করা হবে৷
awk '$7=="\$7.30" { print $3 }' table1.txt
এই ক্ষেত্রে, শর্ত হল $7=="\$7.30", যার মানে হল 7 কলামের উপাদানটি $7.30 এর সমান৷ ডলার চিহ্নের সামনের ব্যাকস্ল্যাশটি সিস্টেমটিকে $7কে একটি পরিবর্তনশীল হিসাবে ব্যাখ্যা করা থেকে বিরত রাখতে এবং পরিবর্তে ডলার চিহ্নটিকে আক্ষরিক অর্থে গ্রহণ করতে ব্যবহৃত হয়৷
সুতরাং এই awk স্টেটমেন্টটি প্রতিটি লাইনের 3য় কলামে উপাদানটি প্রিন্ট করে যার কলাম 7 এ "$7.30" আছে।
আপনি শর্ত হিসাবে নিয়মিত অভিব্যক্তি ব্যবহার করতে পারেন। যেমন:
awk '/30/ { print $3 }' table1.txt
দুটি স্ল্যাশের মধ্যে স্ট্রিং ('/') হল রেগুলার এক্সপ্রেশন। এই ক্ষেত্রে, এটি শুধুমাত্র স্ট্রিং "30।" এর মানে যদি একটি লাইনে "30" স্ট্রিং থাকে, তাহলে সিস্টেমটি সেই লাইনের 3য় কলামে উপাদানটিকে প্রিন্ট করে। উপরের উদাহরণে আউটপুট হবে:
Timberlake,
Gaga,
Presley,
AWK তে গণনা সম্পাদন করুন
যদি টেবিলের উপাদানগুলি সংখ্যা হয়, তাহলে awk এই উদাহরণের মতো তাদের উপর গণনা চালাতে পারে:
awk '{ print ($2 * $3) + $7 }'
বর্তমান সারির ($1, $2, ইত্যাদি) উপাদানগুলি অ্যাক্সেস করে এমন ভেরিয়েবল ছাড়াও, ভেরিয়েবল $0 যা সম্পূর্ণ সারি (লাইন) এবং ভেরিয়েবল NF যা ক্ষেত্রগুলির সংখ্যা ধরে রাখে।
আপনি এই উদাহরণের মতো নতুন ভেরিয়েবলকেও সংজ্ঞায়িত করতে পারেন:
awk '{ sum=0; for (col=1; col<=NF; col++) sum += $col; print sum; }'
এটি প্রতিটি সারির সমস্ত উপাদানের যোগফল গণনা করে এবং মুদ্রণ করে।
Awk বিবৃতিগুলি প্রায়শই sed কমান্ডের সাথে একত্রিত হয়।