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

פקודות, תחביר ודוגמאות

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

פקודות awk פשוטות ניתן להריץ משורת הפקודה . משימות מורכבות יותר צריך להיות כתוב כמו תוכניות awk (שנקרא סקריפטים awk) לקובץ.

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

אופק 'תבנית {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 '$ 7 == "\ $ 7.30" {print $ 3}' table1.txt

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

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

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

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

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

טימברלייק, גאגא, פרסלי,

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

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

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

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

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

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

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