כיצד לכתוב פקודות וסקריפטים של AWK

הפקודה awk היא שיטה רבת עוצמה לעיבוד או ניתוח קבצי טקסט. בפרט, הוא מנתח קבצי נתונים המאורגנים לפי שורות (שורות) ועמודות. ניתן להפעיל פקודות awk פשוטות מה- שורת הפקודה. משימות מורכבות יותר צריכות להיכתב כתוכניות awk (הנקראות awk scripts) לקובץ.

מעצב גרפי עובד עד מאוחר במחשב במשרד
תמונות גיבורים / Getty Images

יסודות AWK

הפורמט הבסיסי של פקודת awk נראה כך:

awk 'pattern {action}' קובץ קלט > קובץ פלט

זה אומר: קח כל שורה בקובץ הקלט; אם השורה מכילה את התבנית, החל את הפעולה על הקו וכתוב את השורה המתקבלת לקובץ הפלט. אם התבנית מושמטת, הפעולה תוחל על כל השורות. לדוגמה:

awk '{ print $5 }' table1.txt > output1.txt

ההצהרה שלעיל לוקחת את האלמנט של העמודה החמישית של כל שורה וכותבת אותו כשורה בקובץ הפלט "output.txt". המשתנה '$4' מתייחס לעמודה הרביעית. באופן דומה, אתה יכול לגשת לעמודה הראשונה, השנייה והשלישית, עם $1, $2, $3 וכו'. כברירת מחדל, ההנחה היא שהעמודות מופרדות על ידי רווחים או טאבים (מה שנקרא רווח לבן). לכן, אם קובץ הקלט "table1.txt" מכיל שורות אלה:

1, ג'סטין טימברלייק, כותרת 545, מחיר $7.30
2, טיילור סוויפט, כותרת 723, מחיר $7.90

3, מיק ג'אגר, כותרת 610, מחיר 7.90 דולר
4, ליידי גאגא, כותרת 118, מחיר $7.30
5, ג'וני קאש, כותרת 482, מחיר $6.50
6, אלביס פרסלי, כותר 335, מחיר $7.30
7, ג'ון לנון, כותר 271, מחיר $7.90
8, מייקל ג'קסון, כותר 373, מחיר $5.50

אז הפקודה תכתוב את השורות הבאות לקובץ הפלט "output1.txt":

545,
723,
610,
118,
482,
335,
271,
373,

אם מפריד העמודות הוא משהו אחר מלבד רווחים או טאבים, כגון פסיק, אתה יכול לציין זאת במשפט awk באופן הבא:

awk -F, '{ print $3 }' table1.txt > output1.txt

זה יבחר את האלמנט מעמודה 3 של כל שורה אם העמודות נחשבות כמופרדות בפסיק. לכן הפלט, במקרה זה, יהיה:

כותרת 545
כותרת 723
כותרת 610
כותרת 118
כותרת 482
כותרת 335
כותרת 271
כותרת 373

ביטויים מותנים ב-AWK

רשימת ההצהרות בתוך הסוגריים המתולתלים ('{','}') נקראת בלוק. אם תשים א ביטוי מותנה מול בלוק, ההצהרה בתוך הבלוק תתבצע רק אם התנאי נכון.

awk '$7=="\$7.30" { print $3 }' table1.txt

במקרה זה, התנאי הוא $7=="\$7.30", כלומר האלמנט בעמודה 7 שווה ל-$7.30. הצלב האחורי לפני סימן הדולר משמש כדי למנוע מהמערכת לפרש $7 כמשתנה ובמקום זאת לקחת את סימן הדולר כפשוטו.

אז ההצהרה ה-awk הזו מדפיסה את האלמנט בעמודה השלישית של כל שורה שיש לה "$7.30" בעמודה 7.

אתה יכול גם להשתמש בביטויים רגולריים כתנאי. לדוגמה:

awk '/30/ { print $3 }' table1.txt

המחרוזת בין שני האלכסונים ('/') היא הביטוי הרגולרי. במקרה זה, זו רק המחרוזת "30". המשמעות היא שאם שורה מכילה את המחרוזת "30", המערכת מדפיסה את האלמנט בעמודה השלישית של אותה שורה. ה תְפוּקָה בדוגמה לעיל יהיה:

טימברלייק,
קוּקוּ,
פרסלי,

בצע חישובים ב-AWK

אם רכיבי הטבלה הם מספרים, awk יכול להריץ חישובים עליהם כמו בדוגמה זו:

awk '{ print ($2 * $3) + $7 }'

מלבד המשתנים הניגשים לאלמנטים של השורה הנוכחית ($1, $2 וכו'), יש את המשתנה $0 שמתייחס לשורה השלמה (שורה), והמשתנה NF שמחזיק במספר השדות.

אתה יכול גם להגדיר משתנים חדשים כמו בדוגמה זו:

awk '{ sum=0; עבור (קול=1; col<=NF; col++) sum += $col; להדפיס סכום; }'

זה מחשב ומדפיס את הסכום של כל האלמנטים של כל שורה.

הצהרות Awk משולבות לעתים קרובות עם פקודות sed.