Ինչպե՞ս գրել սցենարներ 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 սկրիպտները՝ սկսելով պարզ առաջադրանքներից և աստիճանաբար անցնելով ավելի բարդ առաջադրանքների, քանի որ ավելի հարմարավետ եք դառնում լեզվի հետ: