Ինչպե՞ս գրել սցենարներ Awk ծրագրավորման լեզվով:


Awk-ը տեքստի մշակման հզոր լեզու է, որն անվանվել է իր երեք բնօրինակ հեղինակների՝ Ալֆրեդ Ահոյի, Պիտեր Վայնբերգերի և Բրայան Քերնիգանի անուններով: Սա բազմակողմանի լեզու է, որը հիմնականում օգտագործվում է օրինաչափությունների սկանավորման և մշակման համար: Awk-ը Unix սկրիպտավորման հիմնական բաղադրիչն է և սովորաբար օգտագործվում է այնպիսի խնդիրների համար, ինչպիսիք են տվյալների արդյունահանումը, հաշվետվությունը և տվյալների փոխակերպումը:

Awk սկրիպտները արագ են գրվում և լավ են կատարում փոքր և միջին չափի առաջադրանքների համար: Այս հոդվածում մենք ձեզ կծանոթացնենք Awk ծրագրավորման լեզվով սկրիպտներ գրելու հիմունքներին:

Հիմնական շարահյուսություն

Awk ծրագիրը բաղկացած է օրինաչափություն-գործողությունների զույգերի հաջորդականությունից, որոնք գրված են որպես −

pattern { action }

Այստեղ նախշը պայման է։ Եթե մուտքագրման գիծը համապատասխանում է օրինակին, ապա գործողությունը կատարվում է:

Օրինակ −

awk '/search_pattern/ { print $0 }' file_name

Այս օրինակում awk-ը կփնտրի այն տողը, որը ներառում է search_pattern file_name-ից, և եթե այն համընկնի, այն կտպագրի ամբողջ տողը ($0):

Օգտագործելով փոփոխականներ

Awk-ն ունի ներկառուցված փոփոխականներ, որոնք կարող եք օգտագործել ձեր արտադրանքը ձևաչափելու համար: Ամենատարածվածներից մի քանիսն են −

  • $0 - Ամբողջ տողը:

  • $1, $2, ... − Յուրաքանչյուր առանձին դաշտ (կանխադրված սահմանազատված է բացատներով):

  • FS - Դաշտի բաժանարար (կանխադրված է բացատ):

  • OFS − Ելքային դաշտի բաժանարար (կանխադրված է բացատ):

  • NR − Մշակված գրառումների քանակը:

  • NF − Ներկայիս գրառման դաշտերի քանակը:

Դիտարկենք գործնական օրինակ՝ օգտագործելով այս փոփոխականներից մի քանիսը: Ենթադրենք, որ մենք ունենք «students.txt» անունով տեքստային ֆայլ՝ հետևյալ բովանդակությամբ

John Doe 18
Jane Smith 19

Մենք կարող ենք օգտագործել awk անունները և տարիքները առանձին տպելու համար −

awk '{ print "Name: " $1 " " $2 ", Age: " $3 }' students.txt

Արդյունքը կլինի −

Name: John Doe, Age: 18
Name: Jane Smith, Age: 19

Վերահսկիչ հոսք

Awk-ն աջակցում է նաև ընդհանուր կառավարման հոսքի մեխանիզմներին, ինչպիսիք են՝ if, else, while և for: Ահա մի օրինակ՝ օգտագործելով if և else −

awk '{ if ($3 > 18) print $1 " is an adult"; else print $1 " is a minor"}' students.txt

Արդյունքը կլինի −

John is an adult
Jane is a minor

Գործառույթներ

Awk-ն ունի ներկառուցված գործառույթներ տողերի մանիպուլյացիայի, թվաբանական գործողությունների և մուտքագրման/ելքի, ի թիվս այլոց: Դուք կարող եք նաև սահմանել ձեր սեփական գործառույթները:

Ահա օգտագործողի կողմից սահմանված ֆունկցիայի օրինակ, որը փոխակերպում է ջերմաստիճանը Ֆարենհայթից Ցելսիուսի -

function toCelsius(fahrenheit) {
   return (fahrenheit - 32) * 5/9
}

BEGIN { print "Fahrenheit Celsius" }
{ print $1, toCelsius($1) }

Եթե մենք ունենք «temperatures.txt» մուտքային ֆայլ՝ Ֆարենհայթի ջերմաստիճաններով −

32
212

Արդյունքը կլինի −

Fahrenheit Celsius
32 0
212 100

Կանոնավոր արտահայտություններ

Awk-ն աջակցում է կանոնավոր արտահայտությունների շարահյուսություն, որը կարող է օգտագործվել օրինաչափությունների համապատասխանության մեջ: Ահա մի հիմնական օրինակ, որտեղ մենք փնտրում ենք տողեր մեր «students.txt»-ում, որոնք սկսվում են «J» տառով −

awk '/^J/ { print $0 }' students.txt

Այս դեպքում caret (^) նշանը ներկայացնում է տողի սկիզբը: Այս սցենարը դուրս կգա −

John Doe 18
Jane Smith 19

Զանգվածներ

Awk-ն աջակցում է միաչափ զանգվածներ, որոնք կարող են օգտագործվել տվյալների ավելի բարդ մանիպուլյացիայի համար: Եկեք դիտարկենք մի դեպք, երբ մենք ցանկանում ենք հաշվել մեր «students.txt» ֆայլում տարիքային դեպքերը: Ահա թե ինչպես կարող եք դա անել -

awk '{ count[$3]++ } END { for (age in count) print age " appears " count[age] " times." }' students.txt

Սա կարտադրի −

18 appears 1 times.
19 appears 1 times.

Այս սկրիպտում count[$3]++-ն օգտագործում է տարիքը (երրորդ դաշտը) որպես զանգվածի բանալի և ավելացնում է դրա արժեքը ամեն անգամ, երբ այն հայտնվում է:

Ընդլայնված տվյալների մանիպուլյացիա

Awk-ը նաև տրամադրում է մի քանի ներկառուցված գործառույթներ տվյալների ավելի առաջադեմ մանիպուլյացիայի համար: Օրինակ, այն ապահովում է split() ֆունկցիան, որը կարող է տողը բաժանել զանգվածի −

awk '{ split($1, array, ""); print "First letter of the name: " array[1] }' students.txt

Այս սցենարը դուրս կգա −

First letter of the name: J
First letter of the name: J

Awk-ի համատեղում Unix-ի այլ հրամանների հետ

Դուք կարող եք միավորել Awk սկրիպտները Unix-ի այլ հրամանների հետ՝ օգտագործելով խողովակները (|), ինչը այն դարձնում է ավելի հզոր գործիք −

cat students.txt | awk '{ print $1 }' | sort | uniq

Այս հրամանը կտպագրի ուսանողների անունները, կդասավորի դրանք և կհեռացնի կրկնօրինակները: Այս դեպքում ելքը կլինի −

Jane
John

Օգտագործելով սցենարներ Awk-ում

Թեև Awk-ն ուղղակիորեն տերմինալում օգտագործելը սովորական է պարզ առաջադրանքների համար, ավելի բարդ գործողությունների համար ավելի հարմար կարող է լինել սցենարներ գրելը: Awk սկրիպտները հետևում են նույն օրինաչափության-գործողության կառուցվածքին, բայց գրված են առանձին ֆայլում:

Նախ, ստեղծեք նոր ֆայլ .awk ընդլայնմամբ: Սցենարի վերին տողը պետք է լինի shebang տողը, որը ցույց է տալիս Awk թարգմանիչը −

#!/usr/bin/awk -f

Եկեք ստեղծենք Awk սցենար, որը կոչվում է «students.awk», որը հաշվարկում է ուսանողների միջին տարիքը −

#!/usr/bin/awk -f
BEGIN { 
   sum = 0
   count = 0
}
{ 
   sum += $3
   count++ 
}
END {
   print "Average age: " sum/count
}

Սցենարը գործարկելու համար այն գործարկելի դարձրեք chmod +x student.awk-ով, այնուհետև գործարկեք այն ./students.awk students.txt-ով: Սա տպելու է −

Average age: 18.5

Awk սցենարների վրիպազերծում

Awk սկրիպտների վրիպազերծումը կարող է մի փոքր բարդ լինել՝ ներկառուցված վրիպազերծման գործիքների բացակայության պատճառով: Այնուամենայնիվ, տպագիր հայտարարությունների օգտագործումը սկրիպտի տարբեր կետերում փոփոխականների արժեքը ցուցադրելու համար կարող է օգտակար լինել:

Նաև -W dump-variables[=file] տարբերակը կարող է օգտագործվել բոլոր փոփոխականներն ու զանգվածները ֆայլի մեջ վրիպազերծելու համար: Այս տարբերակն օգտագործելու համար դուք պետք է գործարկեք awk -W dump-variables=dump.txt script.awk:

Ընդլայնված նախշերի համապատասխանեցում

Awk-ն աջակցում է նաև օրինաչափությունների առաջադեմ համընկնումը կանոնավոր արտահայտությունների հետ: Օրինակ՝ դուք կարող եք օգտագործել ~ օպերատորը՝ դաշտը կանոնավոր արտահայտության հետ համապատասխանեցնելու համար։

Դիտարկենք Student.txt ֆայլը լրացուցիչ դաշտով այն դասընթացի համար, որը նրանք ուսումնասիրում են −

John Doe 18 ComputerScience
Jane Smith 19 Mathematics

Համակարգչային գիտություն սովորող ուսանողներին գտնելու համար կարող եք գրել −

awk '$4 ~ /ComputerScience/ { print $1 " " $2 " is studying Computer Science." }' students.txt

Սա կարտադրի −

John Doe is studying Computer Science.

Եզրակացություն

Awk-ը հզոր գործիք է Unix-ի վրա հիմնված համակարգերում տեքստի մշակման համար: Նրա ուժը կայանում է իր պարզության և շարահյուսության պարզ բնույթի մեջ: Անկախ նրանից, թե դուք մանիպուլյացիա եք անում տեքստը կամ կատարում եք թվաբանական հաշվարկներ, Awk-ը հիանալի գործիք է ձեր ծրագրավորման գործիքակազմում:

Հիշեք, որ Awk (կամ ցանկացած լեզու) սովորելու լավագույն միջոցը այն օգտագործելն է: Փորձեք ստեղծել ձեր սեփական Awk սկրիպտները՝ սկսելով պարզ առաջադրանքներից և աստիճանաբար անցնելով ավելի բարդ առաջադրանքների, քանի որ ավելի հարմարավետ եք դառնում լեզվի հետ: