Awk

Perusmuoto

awk '{ print }' tiedosto          # tulosta jokainen rivi
awk '{ print $1 }' tiedosto       # tulosta ensimmäinen kenttä
awk -F: '{ print $1 }' /etc/passwd  # kenttäerotin ":"
awk -f skripti.awk tiedosto        # ohjelma tiedostosta

Sisäänrakennetut muuttujat

Muuttuja Kuvaus
$0 Koko nykyinen rivi
$1, $2, ... Rivin kentät järjestyksessä
NF Kenttien lukumäärä rivillä
NR Nykyisen rivin numero (kaikkien tiedostojen yli)
FNR Rivin numero nykyisessä tiedostossa
FS Kenttäerotin (oletus: välilyönti/tabulaattori)
OFS Tulosteen kenttäerotin
RS Tietueen (rivin) erotin
ORS Tulosteen tietueen erotin
FILENAME Käsiteltävän tiedoston nimi

Ohjelman rakenne

awk 'BEGIN { print "Alussa" }
     { print "Joka rivillä:", $0 }
     END { print "Lopussa" }' tiedosto

BEGIN suoritetaan ennen syötteen lukua, pääosa jokaiselle riville, END kun kaikki on luettu.

Ehdot ja suodatus

awk '$3 > 100 { print $1 }' data.txt      # rivit, joilla 3. kenttä > 100
awk '/virhe/ { print }' loki.txt          # rivit, jotka täsmäävät regexiin
awk '$2 ~ /^A/ { print }' data.txt        # 2. kenttä alkaa kirjaimella A
awk 'NR == 1' tiedosto                    # vain ensimmäinen rivi
awk 'NR > 1' tiedosto                     # ohita otsikkorivi
awk 'NF > 0' tiedosto                     # ohita tyhjät rivit
awk '$1 == "virhe" || $1 == "varoitus"' loki.txt

Laskenta ja koonti

awk '{ summa += $1 } END { print summa }' luvut.txt
awk '{ summa += $1; n++ } END { print summa/n }' luvut.txt   # keskiarvo
awk 'max == "" || $1 > max { max = $1 } END { print max }' luvut.txt
awk 'END { print NR }' tiedosto           # rivien lukumäärä

Taulukot (assosiatiiviset)

# Laske sanojen esiintymät
awk '{ for (i=1; i<=NF; i++) count[$i]++ }
     END { for (sana in count) print sana, count[sana] }' teksti.txt

# Ryhmittely toisen kentän mukaan
awk -F, '{ summa[$2] += $3 } END { for (k in summa) print k, summa[k] }' data.csv

Merkkijonofunktiot

Funktio Kuvaus
length($0) Merkkijonon/rivin pituus
substr(s, alku, pituus) Osamerkkijono
toupper(s) / tolower(s) Iso/pieni kirjainkoko
split(s, arr, erotin) Pilko merkkijono taulukkoon
gsub(regex, korvaus, s) Korvaa kaikki osumat
sub(regex, korvaus, s) Korvaa ensimmäinen osuma
sprintf(fmt, ...) Muotoile merkkijono

Omat funktiot

awk '
function nelio(x) { return x * x }
{ print nelio($1) }
' luvut.txt

Käytä funktioiden nimissä pelkkiä ASCII-kirjaimia (ei ä/ö/å) — monet awk-toteutukset (mm. mawk, alkuperäinen awk) eivät hyväksy muita kuin ASCII-merkkejä tunnisteissa, joten esim. neliö voi aiheuttaa syntaksivirheen.

Tulosteen muotoilu

awk '{ printf "%-10s %5d\n", $1, $2 }' tiedosto   # sarakkeistettu tuloste
awk 'BEGIN { OFS="," } { print $1, $2 }' tiedosto  # vaihda kenttäerotin

Useampi tiedosto ja rivin erotin

awk '{ print FILENAME, NR, $0 }' a.txt b.txt   # tiedostonimi + globaali rivinumero
awk 'BEGIN { RS="" ; FS="\n" } { print $1 }' tiedosto   # kappaleet tietueina