در این پارت از سری آموزش های دستور AWK به یکی از مهم ترین قابلیت های دستور awk میپردازیم که در حقیقت ویرایش فیلد است.
خوب است بدانید که AWK به صورت اتوماتیک خط های ورودی را به فیلدها تقسیم میکند و در حقیقت آنها را مجزا کرده و یک فیلد میتواند به عنوان مجموعه ای از کاراکتر هایی تعریف شود که از فیلدهای دیگر توسط یک مجزا کننده داخلی فیلد جدا میشوند.
اگر با Linux/Unix آشنا هستید و یا برنامه نویسی Shell انجام میدهید باید بدانید که جدا کننده درونی فیلد یا متغییر IFS مخفف Internal Fild Seprator چیست. IFS پیش فرض در awk کلیدهای Tab و Space روی کیبرد هستند.
و اما ایده مجزا سازی فیلد در AWK به این صورت عمل میکند. زمانی که این دستور با یک فایل ورودی روبه رو میشود منطبق بر IFS تعریف شده، اولین مجموعه از کاراکترها به عنوان فیلد اول شناسایی شده و با استفاده از متغییر $1 قابل دسترسی میباشد. مجموعه دوم از کاراکتر ها فیلد دوم میباشد و با استفاده از $2 قابل دسترسی است. سومین مجموعه از کاراکترها نیز فیلد سوم بوده که با استفاده از $3 میتوان به آن دسترسی داشت و همین طور برای فیلدهای چهارم تا پایان مجموعه کاراکترها.
برای درک بهتر ویرایش فیلدهای AWK مثالهای زیر را با هم بررسی میکنیم.
مثال 1 : من یک فایل متنی با نام linux-zone.txt ایجاد کردم.
سپس از طریق command line میخواهم اولین، دومین و سومین فیلد از این فایل را با استفاده از دستور زیر print بگیرم.
همانطور که خروجی دستور بالا را میبینید کاراکترهای 3 فیلد اول براساس IFS تعریف شده که space میباشد پرینت شده اند.
فیلد اول که linux-zone.org میباشد از طریق استفاده از $1 قابل دسترسی است.
فیلد دوم که is میباشد از طریق استفاده از $2 قابل دسترسی است.
فیلد سوم که the میباشد از طریق استفاده از $3 قابل دسترسی است.
اگر شما به خروجی پرینت شده دقت کنید مقادیر فیلدها مجزا نشده اند و این شیوه ایست که به صورت پیش فرض دستور العمل print رفتار میکند.
برای مشاهده خروجی به صورت واضح و به نحوی که بین مقادیر فیلد فاصله (space) باشد شما نیاز دارید که عملگر کاما (,) همانند زیر به دستور اضافه کنید.
نکته مهمی که باید به آن توجه کرد و همیشه به خاطر سپرد این است که استفاده از $ (دالر) در AWK با استفاده آن در Shell Scripting متفاوت است.
تحت شل اسکریپتینگ از $ برای دسترسی به مقدار متغییرها استفاده میشود در حالی که در AWK از $ تنها برای دسترسی به محتوای یک فیلد استفاده میشود و نه برای دسترسی به مقدار متغییرها.
مثال 2 : در این مثال فایل my_shoping.list را بررسی میکنیم که شامل چندین خط میباشد.
برای تنها پرینت گرفتن Unit_Price از هر Item_Name در لیست خرید شما باید دستور زیر را اجرا کنید.
دستور AWK همچنین دستور printf را در خود دارد که به شما در فرمت خروجی تان کمک میکند که در حقیت یک شیوه زیباست به طوری که شما میتوانید خروجی ها را بسیار واضح ببینید. همانطور که میبینید خروجی بالا به اندازه کافی واضح و روشن نیست.
برای فرمت کردن خروجی Item_Name و Unit_Price از printf همانند دستور زیر استفاده میکنیم.
خلاصه :
زمانی که از دستور awk برای فیلتر متن یا رشته های متنی استفاده میکنید ویرایش فیلد یکی از موارد بسیار مهم است، به شما کمک میکند که اطلاعات منظمی را در ستون های موجود در یک لیست دریافت کنید و همیشه به خاطر داشته باشید که استفاده از عملگر $ در دستور AWk با استفاده از آن در Shel Scripting متفاوت است.
امیدوارم این مقاله برای شما مفید بوده باشد و در صورت هر گونه اطلاعات بیشتر در این زمینه باعث خوشحالیست که این مطلب را تکمیل تر کنید.
خوب است بدانید که AWK به صورت اتوماتیک خط های ورودی را به فیلدها تقسیم میکند و در حقیقت آنها را مجزا کرده و یک فیلد میتواند به عنوان مجموعه ای از کاراکتر هایی تعریف شود که از فیلدهای دیگر توسط یک مجزا کننده داخلی فیلد جدا میشوند.
اگر با Linux/Unix آشنا هستید و یا برنامه نویسی Shell انجام میدهید باید بدانید که جدا کننده درونی فیلد یا متغییر IFS مخفف Internal Fild Seprator چیست. IFS پیش فرض در awk کلیدهای Tab و Space روی کیبرد هستند.
و اما ایده مجزا سازی فیلد در AWK به این صورت عمل میکند. زمانی که این دستور با یک فایل ورودی روبه رو میشود منطبق بر IFS تعریف شده، اولین مجموعه از کاراکترها به عنوان فیلد اول شناسایی شده و با استفاده از متغییر $1 قابل دسترسی میباشد. مجموعه دوم از کاراکتر ها فیلد دوم میباشد و با استفاده از $2 قابل دسترسی است. سومین مجموعه از کاراکترها نیز فیلد سوم بوده که با استفاده از $3 میتوان به آن دسترسی داشت و همین طور برای فیلدهای چهارم تا پایان مجموعه کاراکترها.
برای درک بهتر ویرایش فیلدهای AWK مثالهای زیر را با هم بررسی میکنیم.
مثال 1 : من یک فایل متنی با نام linux-zone.txt ایجاد کردم.
کد PHP:
[mohammad@localhost mohammad-exam]$ vim linux-zone.txt
[mohammad@localhost mohammad-exam]$
[mohammad@localhost mohammad-exam]$ cat linux-zone.txt
linux-zone.org online resource of linux cisco voip asterisk elastix mikrotik and hosting
[mohammad@localhost mohammad-exam]$
کد PHP:
[mohammad@localhost ~]$ awk '//{print $1 $2 $3}' linux-zone.txt
linux-zone.orgonlineresource
فیلد اول که linux-zone.org میباشد از طریق استفاده از $1 قابل دسترسی است.
فیلد دوم که is میباشد از طریق استفاده از $2 قابل دسترسی است.
فیلد سوم که the میباشد از طریق استفاده از $3 قابل دسترسی است.
اگر شما به خروجی پرینت شده دقت کنید مقادیر فیلدها مجزا نشده اند و این شیوه ایست که به صورت پیش فرض دستور العمل print رفتار میکند.
برای مشاهده خروجی به صورت واضح و به نحوی که بین مقادیر فیلد فاصله (space) باشد شما نیاز دارید که عملگر کاما (,) همانند زیر به دستور اضافه کنید.
کد PHP:
[mohammad@localhost ~]$ awk '//{print $1, $2, $3;}' linux-zone.txt
linux-zone.org online resource
تحت شل اسکریپتینگ از $ برای دسترسی به مقدار متغییرها استفاده میشود در حالی که در AWK از $ تنها برای دسترسی به محتوای یک فیلد استفاده میشود و نه برای دسترسی به مقدار متغییرها.
مثال 2 : در این مثال فایل my_shoping.list را بررسی میکنیم که شامل چندین خط میباشد.
کد PHP:
No Item_Name Unit_Price Quantity Price
1 Mouse #20,000 1 #20,000
2 Monitor #500,000 1 #500,000
3 RAM_Chips #150,000 2 #300,000
4 Ethernet_Cables #30,000 4 #120,000
کد PHP:
[mohammad@localhost ~]$ awk '//{print $2, $3}' my_shoping.list
Item_Name Unit_Price
Mouse #20,000
Monitor #500,000
RAM_Chips #150,000
Ethernet_Cables #30,000
[mohammad@localhost ~]$
برای فرمت کردن خروجی Item_Name و Unit_Price از printf همانند دستور زیر استفاده میکنیم.
کد PHP:
[mohammad@localhost ~]$ awk '//{printf "%-10s %s\n",$2, $3}' my_shoping.list
Item_Name Unit_Price
Mouse #20,000
Monitor #500,000
RAM_Chips #150,000
Ethernet_Cables #30,000
[mohammad@localhost ~]$
خلاصه :
زمانی که از دستور awk برای فیلتر متن یا رشته های متنی استفاده میکنید ویرایش فیلد یکی از موارد بسیار مهم است، به شما کمک میکند که اطلاعات منظمی را در ستون های موجود در یک لیست دریافت کنید و همیشه به خاطر داشته باشید که استفاده از عملگر $ در دستور AWk با استفاده از آن در Shel Scripting متفاوت است.
امیدوارم این مقاله برای شما مفید بوده باشد و در صورت هر گونه اطلاعات بیشتر در این زمینه باعث خوشحالیست که این مطلب را تکمیل تر کنید.