BEGIN{ s="ab12cd34" x=gsub("[1-3]","&&",s) print "s=" s x=3 s=ab1122cd334 0 BEGIN{ s="ab12cd34" x=sub("[1-3]","&&",s) print "s=" s 0 x=1 s=ab112cd34 basicsys@mars~/lec11>cat F1 system("sort -n F1") 1
system("echo abc> F2") system("echo def>>f2") system("cat F2") abc def close("f1") 2
getline x <"F1" print "$0=" $0 getline x <"F1" print "$0=" $0 $0= x= $0= x=,"y=" y,"y=" y,"y=" y,"y=" y y=getline z<"f1" print "z=" z,"y=" y x= y=1 x= y=1 x= y=1 x= y=0 z= y=0 3
A[8]="ab" A[]=15 A[4]=70 system("echo -n "" > tmp") for (x in A) { system("echo " x " >>tmp") system("sort -n tmp> tmp1") while (getline x < "tmp1") { print x,a[x] 4 70 8 ab 15 { getline F1 4
{ getline x F1 basicsys@mars~/lec11>cat F2 ab cd { getline x<"f2" F1 x=ab x=cd x=cd 5
הפונקציותsub ו- gsub ב- awk (המשך) הפונקציותsub ו- gsub מחזירותאתמספרההחלפותשבוצעו. עבורsub המספרהמוחזרהוא 0 או 1 עבורgsub המספרהמוחזריכוללהיותגדולמ- 1. לדוגמה, נניחש- s= abcdababef הפקודה gsub( (ab)+,xy,s) מחזירה 2 כי בוצעושתיהחלפות: אחתשלהמחרוזת ab והשניהשלהמחרוזת.abab לפיכך, אם s= abcdababef ונבצע gsub( (ab)+,xy,s) n = המשתנהn יקבל ערך 2. במחרוזתההחלפהבפקודות sub ו- gsub אפשרלהשתמשבסימןהמיוחד & שמשמעותו: החלףאת & בחלקשלהמחרוזתשהתאיםלביטויהרגולארי. לדוגמה, אם s= 12abc354 ונבצע gsub( [1-4], &&,s) אזיהמשתנה s יקבל ערך 1122abc33544. הפונקציה system ב- awk מבנההפונקציה: (מחרוזת) system הפונקציהמבצעתאתהמחרוזתכפקודת.bash לדוגמה, הפקודה ( F1 system( sort תציגעלהמסךאתשורותהקובץ F1 ממוינותבסדרלכסיקוגרפיעולה (בהתאםלפקודה sort של.(bash הפונקציהgetline ב- awk ישמספראפשרויותשימושבפונקציה : getline שםמשתנה getline שםקובץ > getline שםקובץ > שםמשתנהgetline להלןפרוטהמשמעותשלכלאחתמהאפשרויותהנ"ל. getline גורמתלכךשמתבצעמעברלשורתהקלטהבאהבאופןמידי (ולא בסיוםתוכניתה- ( awk. המשתנים NF,NR,FNR,$0,$1,$2, מתעדכניםלפי שורתהקלטהבאה. כאשרתוכניתה- awk תגיעלסיומהיתבצעמעברלשורת קלטנוספת (כפישקורהבכלסיוםתוכנית.(awk 6
שםמשתנה getline גורמתלכךשערךהמשתנה מתעדכן לפי שורתהקלט הבאה. פרטלכךלאמתבצעכלשינוינוסף, ולכןערכיהמשתנים getline x לאמתעדכנים. לדוגמהלאחרהפקודה NF,NR,FNR,$0,$1,$2, ערךהמשתנה x ישווהלשורתהקלטהבאהוהמשתנה $0 ישארללאשינוי. כאשרתוכניתה- awk תגיע לסיומהיתבצעמעברלשורתהקלטהבאה (כפי שקורהבכלסיוםתוכנית,(awk ואזהערךשלהמשתנה $0 יהיהשווהלערך המשתנהx. "שם קובץ"> getline גורמתלכךשערכיהמשתנים,$2,$1,$0, NF מתעדכניםלפישורתהקלטהבאהמתוךהקובץ. ערכיהמשתנים NR ו- FNR לאמתעדכנים. לדוגמה, לאחר הפקודה F1 > getline ערכיהמשתנים,$2,$1,$0, NF מתעדכניםלפי השורה הראשונה בקובץF1. לאחרפקודה נוספת של F1 > getline ערכי המשתנים הנ"ל מתעדכנים לפי השורה השנייה בקובץF1, וכן הלאה. הפונקציה close( F1 ) סוגרת את הקובץ F1 וגורמתלכך שלאחריה הפקודה הבאה של F1 > getline תעדכן אתערכי המשתנים הנ"ל לפי השורה הראשונה בקובץ. "שם קובץ" משתנה>שם getline גורמתלכךשערך המשתנה מתעדכן לפי שורת הקלט הבאה מהקובץ. לפישורתהקלטהבאהמתוךהקובץ. פרטלכך לאמתבצעכלשינוינוסף, ולכןערכיהמשתנים NF,NR,FNR,$0,$1,$2, לא מתעדכנים. לדוגמה, לאחר הפקודה F1 > getline x ערך המשתנה x שווה לשורה הראשונה בקובץF1. לאחרפקודהנוספת של F1 > getline x ערך המשתנהx שווהלשורה השנייה בקובץF1 וכן הלאה. בכלאחת מהצורות הנ"ל הפונקציה getline מחזירה 1 אםנקראה שורה. אם הפונקציהלא הצליחה לקרוא שורה כי הסמן נמצאבסוף הקובץ (בקריאה מקובץ) אובסוף הקלט (בקריאה מהקלט) אזי הפונקציה מחזירה 0. אם הפונקציהלא הצליחה לקרוא שורה בגללשקרתהשגיאהאזהיאמחזירה 1 -. 7