Skip to content

AWK-opdrachten en -scripts schrijven

16 de juni de 2021
graphicsdesigner 56b54f5a5f9b5829f82d3211

De opdracht awk is een krachtige methode voor het verwerken of analyseren van tekstbestanden. Het analyseert met name gegevensbestanden die zijn georganiseerd in lijnen (rijen) en kolommen. Eenvoudige awk-opdrachten kunnen vanaf de opdrachtregel worden uitgevoerd. Complexere taken moeten als awk-programma’s (genaamd awk-scripts) naar een bestand worden geschreven.

AWK-basis

Het basisformaat van een awk-opdracht ziet er als volgt uit: awk ‘pattern {action}’ input-file > output-file

Dit betekent: neem elke regel van het invoerbestand; als de regel het patroon bevat, past u de actie toe op de regel en schrijft u de resulterende regel naar het uitvoerbestand. Als het patroon wordt weggelaten, wordt de actie toegepast op alle lijnen. Bijvoorbeeld: awk ‘{ print $5 }’ table1.txt > output1.txt

De bovenstaande verklaring neemt het element van de 5e kolom van elke regel en schrijft het als een regel in het uitvoerbestand “output.txt”. De variabele ‘$4’ verwijst naar de vierde kolom. Op dezelfde manier heeft u toegang tot de eerste, tweede en derde kolom met $1, $2, $3, etc. Standaard wordt aangenomen dat kolommen gescheiden zijn door spaties of tabs (de zogenaamde witruimte). Dus als het invoerbestand “table1.txt” deze regels bevat: 1, Justin Timberlake, titel 545, prijs $ 7,30
2, Taylor Swift, Titel 723, Prijs $ 7,90
3, Mick Jagger, titel 610, prijs $ 7,90
4, Lady Gaga, titel 118, prijs $ 7,30
5, Johnny Cash, Titel 482, Prijs $ 6,50
6, Elvis Presley, titel 335, prijs $ 7,30
7, John Lennon, titel 271, prijs $ 7,90
8, Michael Jackson, titel 373, prijs $ 5,50

Dan zou de opdracht de volgende regels naar het uitvoerbestand “output1.txt” schrijven: 545,
723,
610,
118,
482,
335,
271,
373,

Als het kolomscheidingsteken iets anders is dan spaties of tabs, zoals een komma, kunt u dat als volgt specificeren in het awk-statement: awk -F, ‘{ print $3 }’ table1.txt > output1.txt

Dit selecteert het element uit kolom 3 van elke regel als de kolommen worden gescheiden door een komma. Daarom zou de uitvoer in dit geval zijn: Titel 545
Titel 723
Titel 610
Titel 118
Titel 482
Titel 335
Titel 271
Titel 373

Voorwaardelijke expressies in AWK

De lijst met uitspraken tussen accolades (‘{‘,’}’) wordt een blok genoemd. Als u een voorwaardelijke expressie voor een blok plaatst, wordt de instructie binnen het blok alleen uitgevoerd als de voorwaarde waar is. awk ‘$7==”$7.30″ { print $3 }’ table1.txt

In dit geval is de voorwaarde $7==”$7.30″, wat betekent dat het element in kolom 7 gelijk is aan $7.30. De backslash voor het dollarteken wordt gebruikt om te voorkomen dat het systeem $ 7 als een variabele interpreteert en in plaats daarvan het dollarteken letterlijk neemt. Dus deze awk-instructie drukt het element af in de 3e kolom van elke regel met een “$ 7.30” in kolom 7. U kunt ook reguliere expressies als voorwaarde gebruiken. Bijvoorbeeld: awk ‘/30/ { print $3 }’ table1.txt

De string tussen de twee schuine strepen (“https://www.levensdraad.com/”) is de reguliere expressie. In dit geval is het alleen de tekenreeks ’30’. Dit betekent dat als een regel de tekenreeks “30” bevat, het systeem het element in de 3e kolom van die regel afdrukt. De uitvoer in het bovenstaande voorbeeld zou zijn: Timberlake,
Gaga,
Presley,

Berekeningen uitvoeren in AWK

Als de tabelelementen getallen zijn, kan awk er berekeningen op uitvoeren zoals in dit voorbeeld: awk ‘{ print ($2 * $3) + $7 }’

Naast de variabelen die toegang hebben tot elementen van de huidige rij ($1, $2, etc.), is er de variabele $0 die verwijst naar de volledige rij (regel), en de variabele NF die het aantal velden bevat. U kunt ook nieuwe variabelen definiëren zoals in dit voorbeeld: awk ‘{ sum=0; voor (col=1; col<=NF; col++) som += $col; afdruksom; }'

Dit berekent en drukt de som van alle elementen van elke rij af. Awk-instructies worden vaak gecombineerd met sed-opdrachten.