در سومین بخش از مقالات AWK به فیلتر کردن متن یا عبارات متنی بر اساس الگوهای خاصی که یک کاربر تعریف میکند خواهیم پرداخت.
گاهی اوقات به هنگام فیلتر متن میخواهید که خط های خاصی از یک فایل ورودی و یا خط هایی از رشته های بر اساس یک شرط داده شده و یا همچنین با استفاده از یک الگوی خاص که با عبارت match شود را نمایش دهیم. انجام چنین کارهایی با awk آسان است و در حقیقت اینها قابلیت های بی نظیری از این دستور هستند که به شما کمک خواهند کرد.
در مثال زیر فایلی با نام food_prices.list میبینید که یک لیست خرید است و شامل آیتم های غذایی هست که شما میخواهید بخرید. و شامل لیست مواد غذایی و قیمت های آنها میباشد :
اکنون میخواهید مواد غذایی که قیمت آنها بیشتر از 2 دلار باشد را با استفاده از علامت ستاره (*) در پایان آن خط مشخص کنید. این کار با استفاده از دستور زیر انجام میشود.
همانطور که در خروجی بالا میبینید یک علامت * در پایان خط هایی که آیتم غذایی آنها mangoes (انبه) یا pineapples (آناناس) است قرار گرفته اگر شما قیمت آنها را چک کنید بیشتر از 2 دلار هستند.
در این مثال ما از 2 الگو استفاده کردیم :
اول / *\$[2-9]\.[0-9][0-9] */ خط هایی را بر میگرداند که قیمت ایتم غذایی بیشتر از 2 دلار باشد و
دوم /*\$[0-1]\.[0-9][0-9] */ دنبال خط هایست که قیمت آیتم غذایی کمتر از 2$ باشد.
اتفاقی که میافتد این است که زمانی که یک الگو با قیمت ایتم غذایی بزرگتر از 2$ مچ میشود تمامی 4 فیلد موجود به همراه علامت * در پایان آن خط print میشود.
patern دوم خط های دیگر را که قیمت غذا کمتر از 2$ باشد که در فایل ورودی food_prices.list موجود میباشد را print میکند.
به این شیوه شما میتوانید از action های خاص یک patern برای فیلتر کردن آیتم های غذایی که قیمت شان بیشتر از 2$ هست استفاده کنید. اگر چه مشکلی در خروجی وجود دارد خط هایی که علامت * دارند همانند بقیه خط ها فرمت شده نیستند و خروجی به اندازه کافی واضح نیست. ما مشکل شبیه به این را در پارت دوم از سری آموزش های AWK داشتیم و میتوانیم آن را به 2 شیوه رفع کنیم :
1 - استفاده از دستور printf که راهی طولانی و خسته کننده هست و از طریق دستور زیر امکان پذیر است :
2 - استفاده از فیلد $0 میباشد. AWK از متغییر 0 برای ذخیره کردن کل یک خط ورودی استفاده میکند. برای حل مشکل بالا استفاده از این فیلد بسیار آسان و سریع همانند زیر میباشد :
نتیجه :
راه های ساده ای برای فیلتر کردن متن با استفاده از اکشن خاص الگویی وجود دارد که میتوان در مشخص کردن خط هایی از متن یا رشته یا یک فایل با استفاده از دستور AWK از آنها بهره جست.
امیدوارم این پست برای شما مفید واقع شده باشد و به شما توصیه میکنم که حتما پست سری بعدی را نیز مطالعه بفرمایید که در مورد استفاده از عملگرهای مقایسه در ابزار awk میباشد.
گاهی اوقات به هنگام فیلتر متن میخواهید که خط های خاصی از یک فایل ورودی و یا خط هایی از رشته های بر اساس یک شرط داده شده و یا همچنین با استفاده از یک الگوی خاص که با عبارت match شود را نمایش دهیم. انجام چنین کارهایی با awk آسان است و در حقیقت اینها قابلیت های بی نظیری از این دستور هستند که به شما کمک خواهند کرد.
در مثال زیر فایلی با نام food_prices.list میبینید که یک لیست خرید است و شامل آیتم های غذایی هست که شما میخواهید بخرید. و شامل لیست مواد غذایی و قیمت های آنها میباشد :
کد PHP:
$ cat food_prices.list
No Item_Name Quantity Price
1 Mangoes 10 $2.45
2 Apples 20 $1.50
3 Bananas 5 $0.90
4 Pineapples 10 $3.46
5 Oranges 10 $0.78
6 Tomatoes 5 $0.55
7 Onions 5 $0.45
اکنون میخواهید مواد غذایی که قیمت آنها بیشتر از 2 دلار باشد را با استفاده از علامت ستاره (*) در پایان آن خط مشخص کنید. این کار با استفاده از دستور زیر انجام میشود.
کد PHP:
awk '/ *\$[2-9]\.[0-9][0-9] */ {print $1, $2, $3, $4, "*" ;} / *\$[0-1]\.[0-9][0-9] */ {print;}' food_prices.list
کد PHP:
[mohammad@localhost ~]$ awk '/ *\$[2-9]\.[0-9][0-9] */ {print $1, $2, $3, $4, "*" ;} / *\$[0-1]\.[0-9][0-9] */ {print;}' food_prices.list
1 Mangoes 10 $2.45 *
2 Apples 20 $1.50
3 Bananas 5 $0.90
4 Pineapples 10 $3.46 *
5 Oranges 10 $0.78
6 Tomatoes 5 $0.55
7 Onions 5 $0.45
[mohammad@localhost ~]$
در این مثال ما از 2 الگو استفاده کردیم :
اول / *\$[2-9]\.[0-9][0-9] */ خط هایی را بر میگرداند که قیمت ایتم غذایی بیشتر از 2 دلار باشد و
دوم /*\$[0-1]\.[0-9][0-9] */ دنبال خط هایست که قیمت آیتم غذایی کمتر از 2$ باشد.
اتفاقی که میافتد این است که زمانی که یک الگو با قیمت ایتم غذایی بزرگتر از 2$ مچ میشود تمامی 4 فیلد موجود به همراه علامت * در پایان آن خط print میشود.
patern دوم خط های دیگر را که قیمت غذا کمتر از 2$ باشد که در فایل ورودی food_prices.list موجود میباشد را print میکند.
به این شیوه شما میتوانید از action های خاص یک patern برای فیلتر کردن آیتم های غذایی که قیمت شان بیشتر از 2$ هست استفاده کنید. اگر چه مشکلی در خروجی وجود دارد خط هایی که علامت * دارند همانند بقیه خط ها فرمت شده نیستند و خروجی به اندازه کافی واضح نیست. ما مشکل شبیه به این را در پارت دوم از سری آموزش های AWK داشتیم و میتوانیم آن را به 2 شیوه رفع کنیم :
1 - استفاده از دستور printf که راهی طولانی و خسته کننده هست و از طریق دستور زیر امکان پذیر است :
کد PHP:
awk '/ *\$[2-9]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4 "*" ; } / *\$[0-1]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4; }' food_prices.list
کد PHP:
[mohammad@localhost ~]$ awk '/ *\$[2-9]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4 "*" ; } / *\$[0-1]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4; }' food_prices.list
1 Mangoes 10 $2.45*
2 Apples 20 $1.50
3 Bananas 5 $0.90
4 Pineapples 10 $3.46*
5 Oranges 10 $0.78
6 Tomatoes 5 $0.55
7 Onions 5 $0.45
[mohammad@localhost ~]$
کد PHP:
awk '/ *\$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / *\$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list
کد PHP:
[mohammad@localhost ~]$ awk '/ *\$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / *\$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list
1 Mangoes 10 $2.45*
2 Apples 20 $1.50
3 Bananas 5 $0.90
4 Pineapples 10 $3.46*
5 Oranges 10 $0.78
6 Tomatoes 5 $0.55
7 Onions 5 $0.45
[mohammad@localhost ~]$
راه های ساده ای برای فیلتر کردن متن با استفاده از اکشن خاص الگویی وجود دارد که میتوان در مشخص کردن خط هایی از متن یا رشته یا یک فایل با استفاده از دستور AWK از آنها بهره جست.
امیدوارم این پست برای شما مفید واقع شده باشد و به شما توصیه میکنم که حتما پست سری بعدی را نیز مطالعه بفرمایید که در مورد استفاده از عملگرهای مقایسه در ابزار awk میباشد.