Kuidas kirjutada AWK käsud ja skriptid

Käsud, süntaks ja näited

AWK-käsk on võimas tekstifailide töötlemise või analüüsimise meetod - eriti andmefailid, mida korraldavad read (read) ja veerud.

Simple awk käske saab käivitada käsurealt . Üha keerukamad ülesanded tuleks kirjutada failina awk-programmidena (nn awk-skriptid).

ABK käsu põhivorming on selline:

awk 'muster {action} sisendfaili väljundfail

See tähendab: sisestusfaili iga rida; kui rida sisaldab mustrit, rakenda rida tegevusele ja kirjutama saadud joon väljundfailile. Kui muster on välja jäetud, rakendatakse toimingut kogu reale. Näiteks:

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

See väide võtab iga rea ​​5. veeru osa ja kirjutab selle väljundfaili "output.txt" rida. Muutuja "$ 4" viitab teisele veale. Samamoodi saate pääseda esimese, teise ja kolmanda veeru juurde, kus on $ 1, $ 2, $ 3 jne. Vaikimisi loetakse veerud eraldatud tühikute või vahekaartidega (nn tühimikud). Seega, kui sisendfaili "table1.txt" sisaldab neid read:

1, Justin Timberlake, Pealkiri 545, Hind 7,30 $ 2, Taylor Swift, Pealkiri 723, Hind 7,90 $ 3, Mick Jagger, Pealkiri 610, Hind 7,90 $ 4, Lady Gaga, Pealkiri 118, Hind 7,30 $ 5, Johnny Cash, Pealkiri 482, Hind 6,50 $ 6, Elvis Presley, jaotis 335, hind 7,30 $ 7, John Lennon, jaotis 271, hind 7,90 $ 8, Michael Jackson, jaotis 373, hind 5,50 $

Siis kirjutab käsk väljundfailile "output1.txt" järgmised read:

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

Kui veeru eraldaja on midagi muud kui tühikud või vahelehed, näiteks koma, võite selle märkida awk avalduses järgmiselt:

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

See valib iga rea ​​veerus 3 elemendi, kui veerge loetakse komaga eraldatuks. Seega on väljund antud juhul:

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

Keermesulgudes olevate avalduste loend ('{', '}') nimetatakse plokiks. Kui panete blokaadi jaoks tingimusliku väljendi, toimub plokis olev avaldus ainult siis, kui tingimus on tõene.

awk '$ 7 == "\ $ 7,30" (prindi 3 $)' table1.txt

Sellisel juhul on tingimus $ 7 == "\ $ 7.30", mis tähendab, et veerus 7 olev element on võrdne 7,30 dollariga. Dollaritähise ees olevat tagasilöögilangust kasutatakse, et süsteem ei tõlgiks muutujaga $ 7 ja selle asemel võtaks dollari märk sõna otseses mõttes.

Seega avaldab see awk avaldus elemendi iga rea ​​kolmandas veerus, mille veerg 7 on "7,30 dollarit".

Samuti võite kasutada tingimusena regulaaravaldisi . Näiteks:

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

Kaks kaldkriipsu ('/') on regulaaravaldis. Sel juhul on ainult string "30." See tähendab, et kui rida sisaldab stringi "30", siis väljastab süsteem selle rea kolmandasse veergu. Eespool toodud näide väljundiks oleks:

Timberlake, Gaga, Presley,

Kui tabeli elemendid on numbrid awk, võivad nendega arvutada, nagu käesolevas näites:

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

Lisaks muutujatele, mis kasutavad aktiivse rea elemente ($ 1, $ 2 jne), on muutuja $ 0, mis viitab täieliku reale (joonele) ja muutuja NF-le, mis jääb väljade arvule.

Samuti võite määratleda uued muutujad nagu käesolevas näites:

awk '{sum = 0; jaoks (col = 1; col <= NF; col ++) summa + = $ col; prindi summa; } '

See arvutab ja prindib kõigi rea kõigi elementide summa.

Awk avaldused on sageli kombineeritud sed-käskudega .