Skip to main content

AWK-opdrachten en -scripts schrijven

Important Linux Commands for Beginners: Linux Tutorial (April 2025)

Important Linux Commands for Beginners: Linux Tutorial (April 2025)
Anonim

De opdracht awk is een krachtige methode voor het verwerken of analyseren van tekstbestanden, met name gegevensbestanden die zijn gerangschikt op regels (rijen) en kolommen.

Eenvoudig awk opdrachten kunnen worden uitgevoerd vanaf de opdrachtregel. Meer complexe taken moeten worden geschreven als awk-programma's (zogenaamde awk-scripts) voor een bestand.

Het basisformaat van een awk-opdracht ziet er als volgt uit:

awk 'patroon {action}' invoerbestand> uitvoerbestand

Dit betekent: neem elke regel van het invoerbestand; als de regel het patroon bevat, pas dan de actie toe op de regel en schrijf de resulterende regel naar het uitvoerbestand. Als het patroon wordt weggelaten, wordt de actie toegepast op alle regels. Bijvoorbeeld:

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

Deze instructie neemt het element van de 5de kolom van elke regel en schrijft het als een regel in het uitvoerbestand "output.txt". De variabele '$ 4' verwijst naar de tweede kolom. Op dezelfde manier hebt u toegang tot de eerste, tweede en derde kolom, met $ 1, $ 2, $ 3, etc. Standaard worden kolommen verondersteld gescheiden te zijn door spaties of tabbladen (de zogenaamde witruimte). Dus, als het invoerbestand "table1.txt" deze regels bevat:

1, Justin Timberlake, titel 545, prijs $ 7,302, Taylor Swift, titel 723, prijs $ 7,903, Mick Jagger, titel 610, prijs $ 7,904, Lady Gaga, titel 118, prijs $ 7,305, Johnny Cash, titel 482, prijs $ 6,506, Elvis Presley, titel 335, prijs $ 7,307, John Lennon, Title 271, Price $ 7,908, Michael Jackson, titel 373, prijs $ 5,50

Vervolgens schrijft de opdracht de volgende regels naar het uitvoerbestand "output1.txt":

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 in de awk-instructie opgeven:

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

Hiermee wordt het element uit kolom 3 van elke regel geselecteerd als de kolommen worden beschouwd als 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

De lijst met opdrachten binnen de accolades ('{', '}') wordt een blok genoemd. Als u een voorwaardelijke uitdrukking voor een blok plaatst, wordt de instructie in 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 vóór 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 onhandige verklaring drukt het element uit in de derde 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 tekenreeks tussen de twee schuine strepen ('/') is de reguliere expressie. In dit geval is het alleen de string "30." Dit betekent dat als een regel de string "30" bevat, het systeem het element in de derde kolom van die regel afdrukt. De uitvoer in het bovenstaande voorbeeld zou zijn:

Timberlake Gaga, Presley,

Als de tabelelementen getallen zijn, kan awk berekeningen uitvoeren zoals in dit voorbeeld:

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

Naast de variabelen die toegangselementen van de huidige rij ($ 1, $ 2, etc.) hebben, is er de variabele $ 0 die verwijst naar de volledige rij (regel) en de variabele NF die overeenkomt met het aantal velden.

U kunt ook nieuwe variabelen definiëren zoals in dit voorbeeld:

awk '{sum = 0; for (col = 1; col <= NF; col ++) sum + = $ col; afdruksom; }'

Hiermee wordt de som van alle elementen van elke rij berekend en afgedrukt.

Awk-statements worden vaak gecombineerd met sed-opdrachten.