http://forum.ubuntu-fi.org/index.php?topic=45247.msg347720#msg347720

Awk käsittelee kokonaisuudessaan sen mikä sille syötetään olipa se echottu rivi tai cat:attu tiedosto - ja osaa awk lukea itsekin.

Awk:in merkinnät ovat seuraavanlaisia: awk '/ehto/ {toiminto}'
- yhtä ehtoa vastaa yksi toiminto. Kuitenkin toimintoja voi ketjuttaa: {toiminto1} {toiminto2} ....
- mikäli ehtoa ei ole oletetaan kaikkien lauseiden täyttävän ehdon.
- mikäli toimintoa ei ole oletetaan toiminnon olevan print.
- kuitenklaan molemmat eivät saa olla tyhjiä vaan esimerkiksi printtauskäsky on: awk '//'
- Osaapa awk toimia yksikseenkin ilman että sille annetaan mitään, esimerkiksi: awk 'BEGIN { print (2*2) }'
- awk ei kykene asettamaan BASH:in muuttujia suoraan. Myöskään awk ei voi noinvain lukea BASH:in muuttujia. 
- tulostuksen uudelleenohjaus toimii, joten tiedostoon voi kirjoittaa. Uudelleenohjaus toimii samoin kuin BASH:issa.
- awk osaa perusmatematiikan funktiot, sinit sun logaritmit, kykenee ohjelmallisiin matriisioperaatihin, hallitsee exponentti-esitykset ... 
- awk on tekstinkäsittelyssäkin erinomainen
- mikäli tärkeää syytä ei ole, niin tulisi käyttää kovia lainausmerkkejä. Mutta BASH:illa ei ole yleensä otetta kovien lainausmerkkien välisistä muuttujista kun sensijaan pehmeiden lainausmerkkien välisistä muuttujista on.
- https://www.gnu.org/software/gawk/manual/html_node/Index.html#Index

esimerkkejä:

awk '{ print $3 }'                                            # tulosta kenttä 3
awk 'NR > 1 {print $3}'                                       # tulosta kenttä 3, mutta älä riviltä 1 
awk 'END{print $6}'                                           # tulosta viimeiseltä riviltä kenttä 6
awk '/bcdUSB/{print $2}'                                      # tulosta kenttä 2 riveiltä joilla lukee bcdUSB
awk '/home/&&/bash/ {print $1}'                               # tulosta kenttä 1 riveiltä joilla lukee sekä home että bash
awk '/BEGIN/,/END/ {print $0}'                                # tulosta riviltä jolla lukee BEGIN riville jolla lukee END
awk '/home/||/bash/ {print $1}'                               # tulosta kenttä 1 riveiltä joilla lukee joko home tai bash
awk '{/mounted filesystem/}END{print $4}'                     # tulosta kenttä 4 viimeiseltä riviltä jolla lukee: mounted filesystem
awk '{$1=$2=""; print $0}'                                    # tulosta kaikki muut kentät paitsi 1 ja 2
awk '{print " kenttä1="$1"   kenttä2=" $2}'                   # awk laitetaan näin tulostamaan useampi kenttä
awk '/foo/'                                                   # tulosta rivit joilta löytyy teksti: foo
awk '!/foo/'                                                  # tulosta rivit joilta ei löydy tekstiä: foo
awk '/tag1/ {apu=$1;exit} END {print apu}'                    # tulosta kenttä 1 ensimmäiseltä riviltä jolta löytyy teksti: tag1
awk '/tag1/ {apu=$1} END {print apu}'                         # tulosta kenttä 1 viimeiseltä riviltä jolta löytyy teksti: tag1
awk '/foo/ {print $1}'                                        # tulosta kenttä 1 riviltä jolta löytyy teksti:foo.  
                                                              # a=abc; awk "/$a/ {print $1}" ohje -> toimii
awk "/$mistä/,/$mihin/"                                       # tulosta teksti väliltä $mistä-$mihin. Kumpikin hakuavain on BASHin muuttujia  
awk '/BEGIN/,/END/ {print $0}'                                # tulosta lohkot joka alkavat BEGIN ja päättyvät END. Yksi rivi tulostuu END:n jälkeen
awk '/Alkuhetki/,/Loppuhetki/ {print} /Loppuhetki/{print"\n"}'  # tulosta lohkot joka alkavat BEGIN ja päättyvät END. Yksi rivi tulostuu END:n jälkeen, mutta lohkojen väliin tulee tyhjärivi
awk -v n=10 '/END/{p=0}; p && c == n; /BEGIN/ && !p {p=1; c++}' # tulosta n:n määräämä BEGIN/END-lohko äläkä tulosta BEGIN- tai END riviä
awk '/Alkuhetki=/ {flag=1;next} /Loppuhetki=/{flag=0} flag '  # tulosta rivit välistä Alkuhetki= ja Loppuhetki=  . Moitteeton, mutta ei tulosta Alkuhetki= eikä Loppuhetki=
awk '/viimeinen/{f=1}f'                                       # tulosta rivistä jolla lukee viimeinen tiedoston loppuun
awk -v RS='' '/mitä/ {print $0"\n"}' koe                      # tulosta ne lohkot joissa lukee jollakin rivillä teksti: mitä. Lohkoeroitin on tyhjä rivi.
awk -v RS='' '/BEGIN/,/www/ {print $0"\n"}' apu               # tulosta lohkosta BEGIN lohkoon www. Lohkoeroitin on tyhjä rivi.
awk "!/mistä/,/mihin/"                                        #   
awk '/mistä sanasta aloitetaan/,/mihin sanaan lopetetaan/'    # tiedoston tekstipalasen tulostaminen. 
                                                              # esim: lspci -v | awk '/VGA/,/^$/' lohkon alku on VGA ja loppu tyhjä rivi
awk '!/foo/'                                                  # tulostaa rivit joilta ei löydy tekstiä: foo  
awk -v apu="$haettava" '$0 ~ apu'                             # tulostaa rivit joilta löytyy BASH:issa määrätty hakusana
awk 'END{print}'                                              # tulostaa viimeisen rivin 
awk '{ if (NF > 0) n = $0 }END{print n}'                      # tulostaa viimeisen rivin jolla on tekstiä
awk '/regex/ { print x }; { x=$0 }'                           # tulostaa foo-riviä edeltävä rivi 
awk '/foo/ { getline; print $0; }'                            # tulostaa foo-riviä seuraava rivi
awk '/yksi|kaksi|kolme/'                                      # tulostaa rivit joilta löytyy jokin sanoista yksi, kaksi tai kolme                  
awk '/kortti/,EOF'                                            # tulostaa tiedosto riviltä jossa on jossakin sana kortti loppuun asti
awk '/foo/ && /bar/'                                          # tulostaa rivit joilta löytyy foo tai bar jossain järjestyksessä
awk '/foo/ && !/bar/'                                         # tulostaa rivit joilta löytyy bar mutta ei foo
awk '/foo/,/bar/'                                             # tulostaa rivit riviltä jolta löytyy foo riville jolta löytyy bar. 
awk '{NF=2}1'                                                 # tulostaa 2 ensimmäistä kenttää
awk '$1=15'                                                   # tulostaa koko rivi asettaen ensimmäiseksi kentäksi 15
awk '$1==15'                                                  # tulostaa koko rivi mikäli ensimmäinen kenttä on 15
awk '/regex/ { print x }; { x=$0 }'                           # tulostaa regex:ää edeltävän rivin 
awk '/regex/ { getline; print }'                              # tulostaa regexää seuraavan rivin
awk '/regex/,0'                                               # tulostaa regex-riviltä loppuun
awk '/\(/ {print "sulut " $0}'                                # tulostaa lisäten rivien eteen sanan: sulut mikäli sillä on jossain sulut
awk '{$6=$14;$7=$15}1' FS= OFS=                               # tulostaa kirjoittaen paikalle 6 paikalla 14 olevan ja paikalle 7 paikalla 15 olevan 
awk 'NF--'                                                    # tulostaa kaikki kentät paitsi viimeistä
awk 'NR == FNR{a[$0];next} $0 in a' tiedosto1 tiedosto2       # tulostaa kaikki joka on tiedostoille yhteistä
awk 'NR == FNR{a[$0];next} !($0 in a)' tiedosto2 tiedosto1    # tulostaa mikä on tiedostossa1 mutta ei tiedostossa2
awk /^$/ { print "Tämä rivi on tyhjä" }                       # tulostaa "Tämä rivi on tyhjä" tyhjien rivien kohdalla
awk '/jotain1/ && /jotain2/ && /jotain3/'                     # tulostaa rivit joilla on joku näista (OR)
awk '{ if ($3) print $3 }' file1                              # tulostaa ainoastaan ne rivit joissa on 3 kenttää
awk '{ if ($3&&/höh/) print $3 }' file1                       # tulostaa ainoastaan ne rivit joissa on 3 kenttää ja joilla on jossain sana höh.  
sed "2s/$/ $(awk '{ if ($3&&/höh/)print $3 }' file1)/" file2  # tulostaa file2:n lisäten sen riviin 2 file1:stä rivin 2 kentän 3 mikäli kentässä on jossain sana höh
awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }'      # tulosta matriisi käänteisessä järjestyksessä

echo '.e .f' | awk '{ printf "%d\n", 0x$1<0x$2 }'
echo '.f .f' | awk '{ if (0x$1>0x$x) n=$1}END{printf "%d\n" 0x$1 }'
  
awk '/[+-][0-9]+/ { print "Tämä on kokonaisluku" }'           # kokonaisluku testi
awk '/\.[0-9]+/ { print "Tämä on desimaaliluku" }'            # desimaaliluvun testi
awk '/[0-9]+e[0-9+-]+/ NR{ print "Tämä on liukuluku" }'       # liukuluvun testi
awk '{print $(NF-0)}'                                         # tulosta takaapäin laskien osoitettu sarake (tässä viimeinen sarake)
awk '/linux/' IGNORECASE=1                                    # etsi sana linux riippumatta millainen on sen kirjaikoko
awk 'BEGIN { print strftime() }'                              # tulostaa saman kuin BASH:in date
awk 'BEGIN { print systime() }'                               # tulostaa sekunnit siitä unixin alkuhetkestä x
awk 'BEGIN {FFS=OFS=","} {$1=strftime("%c",$1)} {print}'      # tulostaa sekunnit siitä unixin alkuhetkestä, toinen tapa  
awk '{printf("%d\n",$1 + 0.5)}'                               # pyöristys; toimii sekä positiivisilla- että negatiivisilla luvuilla
awk '{$1=""; print}'                                          # tulosta kaikki muu paitsi kenttä 1 
awk 'BEGIN {print "NR\tFNR\tline"}{print NR"\t"FNR"\t"$0}'    # vähän selvitystä kuinka tulostus toimii
awk '{ temp=$1; $1=$3; $3=temp; print; }'                     # sarakkeiden vaihtaminen keskenään
awk 'END{print NR}'                                           # laske tiedoston riviluku
awk '(NR%2 && /pattern/) || (!(NR%2) && /anotherpattern/)'    # tulosta parillise rivit joilla on pattern ja parittomat rivit joila on toinen-pattern

awk '/pattern1/ && /pattern2/ && !/pattern3/ {print}'         # grepin korvaaja ?
awk '{print NR, $0}' tai:awk  '{$1=++i FS $1;}1' OFS=" "      # rivinumero jokaisen rivin eteen
awk 'END {print NR}'                                          # tiedoston rivien luku
awk '/BEGIN/{n++}; END {print n+0}' /boot/grub/grub.cfg       # niiden rivien luku joissa lukee BEGIN
awk '{ $5=""; print }' file                                   # tulosta kaikki muut kentät paitsi 5
awk -F ':' '{print $1 | "sort";}' /etc/passwd                 # aseta sarakkeiden erotusmerkiksu : ja tulosta sarake 1
du -s ~/OMATSKRIPTIT* | awk '{sum += $1} END {print sum}'     # Kansioiden tai tiedostolistauksien levynkäyttö, summaaminen awk:illa
seq 50 | awk 'BEGIN {a=1; b=1} {print a; c=a+b; a=b; b=c}'    # laske fibonacci-sarjan 50 ensimmäistä jäsentä
awk '{ for (i = 1; i <= NF; i++); { print $$i }}')            # poistaa lauseen edestä ja perästä välilyönnit 
awk '{$1=$1}1'                                                # poistaa etu-välilyönnit.
awk '{$1=$1} !x[$0]++'                                        # poistaa tiedostosta duplikaattirivit poistaen ensiksi välilyönnit awk '{$1=$1} !x[$0]++' edestä ja perästä; super-super-uniq
awk '!NF || !x[$0]++'                                         # poistaa tiedostosta duplikaattirivit jättäen tekstin tyhjät rivit rauhaan
awk '!NF {if (++n <= 2) print; next}; {n=0;print}'            # poistaa tiedoston perästä tyhjät rivit
tac | awk '!a[$0]++' | tac                                    # poista duplikaatit, mutta niin että viimeinen jää jäljelle   
awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}'                # poistaa ByteOrderMark:in; esimerkiksi notepad lisää sen.
awk 'NF>=3'                                                   # poista tulosteesta ne joissa on alle kolme kenttää
awk 'NF>=1'                                                   # poista tulosteesta tyhjät rivit ( tai pelkästään: awk 'NF' )
awk '{print ($1 < $2 ? 1 : 0)}'      # sama, mutta tulostaa joko 1 tai 0 (vertailtaviksi luvuiksi kelpaa mitkä hyvänsä numerot, vaikka tieteelliset) 

                                                              # Käsky ei tee mitään jos BOM:ia ei ole. Tämä BOM on UTF-8:ssa  
awk '/[^A-Za-z0-9[ ]]/'                                       # tulostaa rivit joilla on yksikin määrittelemätön merkki, [ ] on välilyönti
awk '{$1=$3=""}1'                                             # tulosta tiedopstosta kaikki muu lukuunottamatta kenttiä 1 ja 3
df -P | awk '$6=="/media/KINGSTON" {print $1}'                # tulosta mikä laite on mountattu liitospisteeseen
awk -F ':' '/100[0123456789]/ {print $1}' /etc/passwd         # luettele käyttäjät
sudo dmidecode -t 17 | awk -F":" '/Speed/ { print $2 }'       # muistin taajuus /usr/sbin/dmidecode | grep -i "current speed"
awk '{print NR,": ",$0}'                                      # tulosta tiedosto ja rivinumeroi se
awk '{print length, $0;}' tiedosto | sort -nr                 # tulosta tiedosto rivin merkkien luvun mukaan
awk '{print(substr($0,5,15))}'                                # tulosta tiedoston jokaiselta riviltä merkit 5-20
awk 'length>72'                                               # tulosta tiedoston vähintään 72 merkkiä pitkät rivit

awk '/export/{print x};{x=$0}'                                # tulosta rivin jolla on export edellinen rivi x
echo "one=two three" | awk -F "=| " {'print $1, $3'}          # tulostaa: one three -> awk:iin voidaan määrätä useampi kentänjako tai-funktiolla 
awk '!_[$0]++{print}' < test                                  # tulosta vain parittomat rivit?
awk '{if (NR % 2 == 0) print $0}'                             # tulosta vain parilliset rivit
awk '{ print substr( $0, length($0) - 1, length($0) ) }'      # tulosta rivin kaksi viimeistä merkkiä
awk /kortti/"{print;exit}"                                    # tulosta ensimmäinen rivi jolla on sana kortti ja lopeta siihen
awk 'BEGIN {a="\047"} {print a "hello" a;}'                   # tulostaminen kuntulostettavassa on kova lainaus-merkki '

awk '{gsub("aaa","b",$5)}1'                                   # muuta sana aaa sanaan b, mutta vain viidennessä kentässä. Jos kenttää ei ole niin
                                                              # muutos tehdään kaikkialla
awk '{for(i=1;i<=NF;i++) t+=$i; print "rivisumma:",t; t=0}'   # rivisummien laskeminen kun taulukon kokoa ei tiedä
awk '{for(i=1;i<=NF;i++) s[i]+=$i} END {for(i=1;i<=NF;i++) print "sarakesumma=" s[i]}' # sarakesummien laskeminen kun taulukon kokoa ei tiedä
awk '{if ($1 % 2 == 0) print $1 " on parillinen" ;else print $1 " on pariton"}'        # parillisuustesti
awk '{ FS = OFS = "#" } { if ($9==1234) print }' filename*.log > bigfile.log           # tulosta kun kentän arvo on oikea - FS ja OFS ei tarvita jos ne ovat " "awk 1 RS=", "
awk '{word=(substr($0,index($0,"blah")));print word}' <<< /home/petteri/blah/hhhh      # tulostaa: blah/hhhh
awk '{print $1}' ~/.bash_history | sort | uniq -c | sort -rn | head -n 10              # tulosta 10 käytetyintä käskyjä
awk '{sum+=$1; sumsq+=$1*$1} END {print sqrt(sumsq/NR - (sum/NR)^2)}'                  # sarakkeen normaalipoikkeama
awk '{ for (i = 1; i <= NF; i++); { printf("%s ", i);}; printf("\n"); }'               # tiedoston välilyöntien supistaminen yhdeksi
awk '{split($0,a," "); for (i = 1; i <= NF; i++) print a[i]}' # tekstijonon jakaminen välilyöntien kohdilta: awk -Fjakaja '{ ...
awk '$NF ~ /^[ACTG][ACTG][ACTG]$/'                            # tulostaa mikäli viimeisessä kentässä on kolme kirjainta ryhmästä: ACTG
awk 'length($NF)==3'                                          # tulostaa jos viimeisen kentän pituus on 3
awk 'length($1)==4'                                           # tulosta jos kentän 1 pituus on 4  
awk 'END { print }'                                           # tulostaa viimeisen rivin
awk NF=NF FS=                                                 # lisää kiaikkien kirjainten väliin välilyönnin
awk '$0 ~ /(Yksi | yksi | yksi.)/ {print $2}'                 # tulostaa kentän 2 kaikilta rivieiltä joilla on joku etsityistä.
awk '$2 ~ /^16/'                                              # tulostaa rivin jos toinen kenttä alkaa 16
awk 'ORS=NR%5?FS:RS'                                          # tulosta kenttiin jakaen %:n jälkeisen luvun mukaan
awk '{if (sub(/\\$/,"")) printf "%s", $0; else print $0}'     # rivin päättyessä merkkiin \ ei merkkiä \ tulosteta eikä myöskään rivinsiirtoa
awk '{if ($0 > " " )  n=NR}END{print n}'                      # tulosta viimeisen sellaisen rivin numero jolla on jotakin
awk 'BEGIN{print strtonum( 0xffffffffffffffffffffffffffff )}' # muunna hexa desimaaliluvuksi. pistettä ei saa olla eikä etumerkkiä 
awk 1 RS=", "                                                 # muunna kaikki pilkut rivinvaihdoiksi mikäli pilkkua seuraa välilyönti 
awk '{gsub(", ", "\n", $0)}1'                                 # muunna kaikki pilkut rivinvaihdoiksi mikäli pilkkua seuraa välilyönti
echo '-.ffffffffffffffd -.fffffffffffffff' | awk '{ if (0x$1>0x$x) print $1 ;else print $2}'

awk '/haettava/{f=1}f'               # tulosta siitä rivistä alkaen jossa etsitty on ensimmäistä kertaa
awk 'f;/haettava/{f=1}'              # jätä se ensimmäinen löytörivin jälkeinen tulostamatta mutta tulosta kaikki sen jälkeen
awk 'c&&!--c;/haettava/{c=N}'        # tulosta N riviä jokaisen löydön jälkeen
awk 'c&&!--c{next}/haettava/{c=N}1'  # tulosta kaikki muut rivit paitsi löytörivin jälkeiset N
awk 'c&&c--;/haettava/{c=N}'         # tulosta N riviä löydön jälkeen
awk 'c&&c--{next}/haettava/{c=N}1'   # tulosta kaikki muut rivit paitsi N löydön jälkeen
awk '/haettava/{c=N}c&&c--'          # tulosta N riviä löydön jälkeen
awk '/Bill/{n++}; END {print n+0}'   # tulosta montako kertaa tekstissä puhutaan Bill:istä        
awk '{ print ($1 < $2)}'             # vertailu toimii desimaali-numeroillekin. Ottaa etumerkin huomioon. Mutta tulostaa joko 1 tai tyhjää


echo 222 | gawk --re-interval '/2{3}/'    # etsii missä on vähintään 3kpl merkkejä:2 peräkkäin
awk '/regex/{print x};{x=$0}'             # etsi mistä regex löytyy ja tulosta edellinen rivi (regex on esim. [0-9])
awk '{gsub("mikä","miksi",$0); print $0}' # tekstin muuttaminen toiseksi awk:illa - ehkä nopeampi kuin sed
awk '$2 == "/media/petteri/tikku" {print $1}' /etc/mtab                # tulostaa tikun laitenimen (esim. /dev/sdb1)
awk 'BEGIN { FS = ":" } {if ($3>999)  print $1 | "sort" }' /etc/passwd # lista koneen käyttäjistä
awk -F: '/home/&&/bash/ {print $1}' /etc/passwd                        # lista koneen käyttäjistä (ihmisistä), nopein 
awk -F'[0-9][0-9]' '{print $2}'                                        # myös regex kelpaa kentän-jakopisteeksi
awk -F : '{print $1}' /etc/passwd                                      # lista koneen käyttäjistä (suurin osa on käyttöjärjestelmän ohjelmia)
echo 33 | awk '{printf("  %3d     %2x    %c\n", $1, $1, $1)}'          # tulostaa: 33 21 !   (=desimaali,hexa,ascii)  
awk -v RS='' '{ print $0 > "/tmp/delmee"NR }' ~/koe2                   # tiedoston jakaminen ali-tiedostoiksi tyhjien rivien kohdilta:  
awk '$2 == "/media/'$USER'/tikku" {print $1}' /etc/mtab            # ilmoittaa liitoskohdan; kovien lasinausmerkkien välissä olevalle ei tehdä expansiota, joten lainauksista poistutaan hetkeksi


näppäimien lukeminen:
awk 'BEGIN {print "kerropa ikäsi:"; getline ika < "-"; print "ensi vuonna olet: " ika + 1 }' 

Awk voi käyttää BASH:in muuttujia myös seuraavasti: x=1; y=2; echo | awk -v x=$x -v y=$y 'BEGIN{summa=x+y}{print summa}'  
- arvot voidaan antaa kokonaislukuina tai liukulukuina (2.71 tai:2.71E1). 
- tyyppimääreitä ei ole, vaan tyypitys tapahtuu automaattisesti kun muuttujalle annetaan arvo.
- tekstijonot ovat pehmeissa lainausmerkeissä ("Hello world").
- tiedostonimet ovat pehmeissä suluissa. Kun tiedosto avataan pysyy se auki kunnes erillisellä close-käskyllä suljetaan tai kun awk 
  lopetetaan.
- kovat lainausmerkit kuuluvat awk:iin ja esimerkiksi tulosteissa käytetään pehmeitä lainausmerkkejä ( kova on ' ja pehmeä " )
- awk osaa lukea samanaikaisesti useista tiedostoista
- Jos asialle on yksi awk-ratkaisu on niitä miljoona muutakin ja ne ovat lisäksi täysin erinäköisiä, nopeuksisia ja käyttävät
  koneen resursseja täysin eritavoin.
- useimpiin ongelmiin löytyy hidas, mutta käsitettävä BASH-ratkaisu. Vielä useampiin ongelmiin löytyy nopea mutta jokseenkin
  vaikeasti ymmärrettävä awk-ratkaisu. Suurin vaikeus varsinkin awk:in kanssa on se että maailmalla esitetään ongelmiin monia 
  eri-tasoisia ratkaisuja: täysin käsittämättömiä pitkiä koodi-rimpsuja ja muutamalla sanalla kuvattuja.  

____________________________________________________________________________________________________________________________

Jokaisessa awk-lauseessa on teoriassa kolme osaa: 

1. BEGIN joka suoritetaan kerran alussa. Jos BEGIN osassa ei ole suoritettavaa niin sen voi jättää pois. Mikäli awk:issa tehdään 
   joku kertasuoritus, esimerkiksi lasketaan jotakin niin se suoritetaan BEGIN osassa ja muut osat jätetään pois.
   - teoriassa BEGIN osassa ei vielä ole luettu mitään eikä tiedostoa kuvaavilla ole vielä arvoa ja END osassa on tiedostosta jo
     unohdettu kaikki ja ainoastaan itse asetetut muuttujat tunnetaan

2. Runko joka suoritetaan niin monta kertaa kuin käsiteltävässä on rivejä: siis awk:n runko on looppi jota ei täydy eikä voi 
   määritellä ja NR on sen rivilaskuri. Runko on se awk jota normaalisti käytetään ja nuo BEGIN ja END jätetään pois.
   - rungon lauseet ovat tyypiltään: ehto-{toiminto} jossa toiminto suoritetaan mikäli ehto on tosi. Ehto-{toimintoja} voi olla 
     useampiakin kaksoispilkulla erotettuina. Mutta yhteen ehtoon tulee vain yksi toiminto; useampiakin toimintoja voidaan ehtoon 
     kyllä laittaa mutta ne täytyy silloin erottaa lohkoksi kaarisuluilla.
   - awk lukee sisäänmenonsa rivi kerrallaan ja jakaa rivin jokaisen sanan omaan muuttujaansa.  Näihin muuttujiin viitataan $1, $2, $3 ...
     ja muuttuja $0 on koko lause. Jako suoritetaan muuttujan FS perusteella; FS:llä on awk:in alkaessa arvona välilyönti mutta 
     käyttäjä voi antaa sille minkähyvänsä uuden arvon käskyllä: -F<välimerkki>
   - awk laskee kuinka monta kenttää luetussa lauseessa on ja asettaa muuttujan NF sen mukaisesti.
   - sisäisiä muuttujia awk:illa on lukemattomia muitakin. Joillakin niistä on oletusarvo jota käyttäjä voi muuttaa ja jotkut arvot
     awk asettaa itse. Tässä muutama:
       - NR     mikä riviä on käsiteltävänä, siis alkaa yhdestä ja kasvaa joka riviä kohden yhdellä
       - IFS    mikä merkki on kenttä-eroittimena luettaessa. Oletusarvo on välilyönti. katso esimerkit, siellä puhutaan muuttujista FS ja -F
       - OFS    tämä arvo määrää mikä merkki on kenttä-eroittimena tulostettaessa. Oletusarvo on välilyönti
       - FNR    kertoo kun on luettu monta tiedostoa mikä kussakin riviluku on. Yksittäiselle tiedostolle se on sama kuin NR.
       - RS     kertoo mikä merkki jakaa lauseet(=rivit) luettaessa. Oletusarvo on rivinvaihto \n
       - ORS    kertoo millä merkillä tulostus-rivit jaetaan tulostettaessa. Oletusarvo on rivinvaihto \n
       - FILENAME käsiteltävän tiedosdton nimi. Kun käsiteltäviä on kaksi niin FILENAME viittaa jälkimmäiseen 

3. END joka suoritetaan kerran lopussa. Jos END osassa ei ole suoritettavaa niin sen voi jättää pois. Mutta jos END-osa on niin
   runko-osa täytyy myös olla, vaikka pelkkä numero 0.
   - END-osassa voi olla omia muuttujia hyödyntävää toimintaakin: awk '{a[NR]=$0; i=NR}END{for(m=1;m<=i/2;m++) print a[m]" "a[m+i/2]}' 

   esimerkkejä BEGIN ja END-lohkojen käytöstä:
   - awk 'BEGIN { print "koneessa olevien imageiden lukumäärä:"} /menuentry/{n++} END {print n}' /boot/grub/grub.cfg 
   - seq  21 | awk 'BEGIN {a=1; b=1} {b=b+1;a=a*b} END {print "kertoma: " a}'         
   - awk 'BEGIN { while (count++<50) string=string "x"; print string }'              # tulostaa 50 x:ää 
   - awk 'BEGIN{ count=1; do print "Tämä tulostuu ainakin kerran"; while(count!=1)}' 
   - awk 'BEGIN { srand(); for (i=1;i<=1000;i++){ print int(1 + rand() * 100) }}'    # tulosta 1000 satunnaislukua alueelta 1-100
        tiedostonimien uudelleen-nimeäminen
   - awk -v a=$(ls | tail -1) 'BEGIN { while (a-->-1) string=string "mv " a+1" " a+2"\n"; print string }' | bash                          # kun tiedostonimi on pelkkä numero 
   - awk -v a=$(ls | grep -o [0-9]* | tail -1) 'BEGIN { while (a-->-1) string=string "mv data" a+1" data" a+2"\n"; print string }' | bash # kun tiedostonimessä on edessä tekstiä; esim. data0
  
____________________________________________________________________________________________________________________________

- Awk olettaa paljon siitä mikä jätetään mainitsematta. Määrää siis itse tai awk olettaa !
  Esimerkiksi käsky: awk 1 tiedosto       tulostaa tiedoston sillä 1 on aina tosi ja print suoritetaan kun muutakaan ei määrätä. 
  Lauseessa ei myöskään ole mainintaa siitä mitä pitäisi tulostaa - mutta awk olettaa että haluat tulostaa käsittelyssä olevan 
  rivin jos et määrää toisin. Ja käsky: awk '{ print $1 }' tiedosto     tulostaa tiedoston jokaisen rivin ensimmäisen kentän, 
  sillä koska ehtoa ei ole niin awk olettaa että jokainen rivi täyttää ehdon.

- Kaikki mikä tapahtuu awk:issa unohdetaan kun awk:in suoritus lopppuu. Awk ei pysty asettamaan BASH:in muuttujia eikä BASH
  kykene asettamaan awk:in muuttujia. Mikäli haluaa käyttää awk:in muuttujia BASH:issa täytyy awk:n tulostaa ne ja BASH:in 
  napata muuttujien arvot konstilla: muuttuja=$(awk .....) ja awk:iin päin muuttujat siirretään putkittamalla ne.
  Vaikka awk ei tunnekaan BASH:in muuttujia niin awk kykenee käyttämään BASH:in muuttujia monellakin tavalla, esimerkiksi:
    - koe=12345 ; awk 'BEGIN { print '"$koe"'; }' -> Siis awk:sta pistäydytään hetkeksi BASH:iin. Tällä konstilla piisaa rajoituksia.
    - arvo="4.58"; echo -n "" | awk -v arvo="$arvo" 'BEGIN { print arvo }'
    - haettava="menuentry"; awk "/$haettava/ "'{ osumia++ } END { print "imageiden lukumäärä: " osumia }' /boot/grub/grub.cfg   
    - awk 'BEGIN {  printf "Moikka %s" ,ENVIRON["USER"] }'
    - export a="onnistuu se näinkin"; awk 'BEGIN {  printf "%s" ,ENVIRON["a"] }'
    - export tunnus=$(awk '/ Varaustunnus:/{print $2}' tiedosto); echo $tunnus
  Awk pystyy myös asettamaann BASH:in muuttujia ( tavallaan...). Esimerkiksi:
    - eval $(awk 'BEGIN{ print "muuttuja=yksi"}' < /dev/null); echo $muuttuja tulostaa: yksi
    - declare $( awk 'BEGIN{print "var=17"}' )

Tulostuksia voi ohjailla seuraavilla koodeilla (nämä siis nämä kirjoitetaan tulostettavaan):
\\    kun haluat kirjoittaaa kenon  
\a    soita kelloa
\b    taka-askel (=backspace)
\f    sivunvaihto
\n    rivinsiirto
\r    telanpalautus
\t    pystysuora TAB
\v    vaakasuora TAB (se tavallinen)
\nnn  oktaaliluku
\xhh… hexadesimaaliluku


- Esimerkkejä sisäisten muuttujien käytöstä:
   - awk 'NF'                                           # tiedoston tyhjien rivien poistaminen 
   - awk '{ print FNR " "":"" " $0 }'                   # tulostaa tiedoston rivien eteen: <rivinumero>:
   - awk 'NF { $0=++ a " : " $0 }; { print }'           # tulostaa exeltiedoston rivien eteen: <rivinumero>:
   - Name="jony"; awk -v name="$Name" '$0 ~ name'       # tulostaa rivit joilla on tekstipalanen: Jony
   - awk '{ total = total + NF } END { print total }'   # tulostaa tiedoston sanojen lukumäärä.
   - awk '{if (NR % 2 == 1) print $0}'                  # tulostaa vain parittomat rivit
   - awk 'NR >= 3 && NR <= 6'                           # tulostaa rivit 3-6
   - awk 'BEGIN { ORS="\n\n" }; 1'                      # tulostaa tiedoston rivien väliin tyhjän rivin 
   - awk '1; { print "" }'                              # sama toisella tavalla. 
   - awk 'END {print NR}' tiedost                       # tulostaa tiedoston rivien lukumäärän
   - awk '{if (NR % 2 == 1) print $0}'                  # tulostaa vain parittomat rivit  

   - echo "1=2 3" | awk -F "=| " {'print $1, $2, $3'}   # voidaan määrätä useampikin kentänjako |-funktiolla. 
   - awk 'BEGIN { IFS=" ";OFS="#" } {print $1,$2}'      # tulostuu: 1#2 kun luettavassa on rivi 1 2 
     - print $1,$2 pitää olla pilkun kanssa; print yksinkin tulostaa kaiken, mutta välieroitin ei muutu - print $0 ei myöskään toimi 
   - awk -F':' ' {print $1}'                            # tulostaa 1 kentän mikäli sisäänmenossa on merkki : mutta jos ei ole niin tulostaa koko rivin 
   - awk -F'[0-9][0-9]' '{print $2}'                    # myös regex voidaan määrätä välieroittimeksi
   - awk 'BEGIN { FS = " |:" } ; { print $1 }'          # sama kuin edellinen paitsi että kenttäjakomerkki voi olla joko : tai " "

- awk:n tuntemaa matematiikkaa: + ,-, *, /, %, välilyönti, **, int, log, sqrt, exp, atan2(m,n), sin, cos, tan, rand, srand 
   - luontaista suoritusjärjestystä voi muuttaa suluilla. 
   - matikka on kaksois-tarkkuutta (noin 22 numeroa)
   - awk tuntee kokonaisluvut, desimaaliluvut, tekstijonot ja kaikki matriisit ovat ilmanmuuta assosiatiivisia. 
   - awk:in muuttujat ovat tyypittömiä. Operaatiot ++ ja -- tunnetaan. && on ja-toiminto, || on tai-toiminto ja ! on negaatio.
   - Bitti-operaatioista tunnetaan and, or, xor, lshift, rshift ja compl. And, or ja xor voivat ottaa useampiakin lukuja.
     - echo 'dddd ffff' | awk '{ if ($1>0 && $2>0) if ($1<$2) print $1 ;else print $2; else if ($1>$2) print $1 ;else print $2 ;}' # hexalukujen vertaaminen 
   - välilyöntioperaattori liittää yhteen eri puolillaann olevat. Siten 1+2*3 4; on arvoltaan 74. Esimerkkejä:
     - awk '{sum+=$1; sumsq+=$1*$1} END {print sqrt(sumsq/NR - (sum/NR)^2)}'    # ensimmäisen sarakkeen normaalipoikkeama
     - awk 'BEGIN { print atan2(30,45); }'                                      # palauttaa y/x arctangentin radiaaneissa.
     - seq  21 | awk 'BEGIN {a=1; b=1} {b=b+1;a=a*b} END {print "kertoma: " a}' # kertoma. Huomio että seg 21 tulosteessa on rivinvaihdot  
     - sinin laskeminen taulukoissa: awk '{print sin($1)}'  . 
     - awk 'BEGIN{print .11e1+2.2}'
     - awk 'BEGIN{print sin(1)}'                                     # awk:ille on syötettävä jotakin jotta se toimisi - paitsi kun siinä on pelkkä BEGIN-osa.

- awk:in vertailuoperaattorit ovat: == , != , < , > , <= , >= , ?: ~ ja !~  Esimerkiksi:  
   - tuo ?: on ehdollinen ehto:  ehto ? toimi1 : toimi2  
     Mikäli ehto on tosi toimitaan jatkossa toimi1:n mukaan mutta jos se ei ole tosi niin toimitaan toimi2:n mukaisesti.  
   - regex:ät tunnetaan

- merkkijonon käsittely-funktiot: index, length, match, split, sprintf, sub, gsub, substr, tolower, toupper . Esimerkiksi:     
  - echo ~/kansio1/kansio2/tämä muutetaan suurille | awk -F"/"  '{ $NF=toupper($NF); print }' OFS="/"
  - awk 'BEGIN {var = sprintf("[%8.3f]",3.141592654); print var}'       # siis tämä on toiminto "printtaa stringiin"
  - echo "kattokassinen" | awk '{gsub(/ka/,"ki");print}'                # tulostaa: kittokissinen (gsub=global sub)
  - awk '{ total += gsub(/kanta/,"") } END { print total }' tiedosto    # montako kertaa sana kanta esiintyy
  - awk '{ if (length($0) > max) max = length($0) } END { print max }'  # tulostaa tiedoston pisimmän rivin pituuden
  - awk '{print substr($0, index($0,$N))}'                              # tulosta N-palasesta eteenpäin  
  - awk {'print tolower($_)'}                                           # muutos pienille kirjaimille
  - awk 'length($0)!=12 {print}' your_file_name                         # tulosta rivit jotka eivät ole 12 merkkiä pitkiä
  - awk -F':' '{split($0,a,":"); for (i=1; i<=NF; i++) if (a[i]) print i,"   ",a[i]}' /etc/passwd 
        - siis splitin jakaja ei määrää awk:in jakajaa
        echo 12:34:56 | awk '{split($0,numbers,":"); print numbers[3]}'
  - awk 'BEGIN { print index("peanut", "an") }'                         # tulostaa 3  

length(s) 	        length of s
n=split(s,a) 	        n fields of s splitted in a
n=split(s,a,fs) 	n fields of s with separator fs splitted in a
sprintf(fmt,vars) 	return vars formatted according to fmt
a=substr(s,p)           a is suffix of s starting at p
a=substr(s,p,n) 	a is substring of s starting at p with length n

- I/O:n käsittely-funktiot: close, system 
awk 'BEGIN {for (i=1; i<=10000; i++) system ("echo a")}'          # hidas


- awk tuntee myös ehtolauseet if, if-then ja if-else-then. Awk tuntee myös rakenteen ?: joka on itseasiassa if-else rakenne suppeassa muodossa.
   - esimerkkejä:
   - awk '{ if (NF > 0) printf("%s\n", $0); }'                    # tiedoston tulostaminen tyhjät rivit poistettuina 
   - awk '{if (NR % 2 == 0) print $0; else print "pariton rivi"}' # tulostaa sanan pariton tai rivit jotka ovat parillisia.
   - awk 'if (ehto) {	action1; action2; }
   - awk '{ if (NF > 0) n = $0 }END{print n}' tiedosto            # tulostaa tiedoston viimeisen rivin jolla on tekstiä
   - tac tiedosto | awk '{ if (NF > 0) n = $0 }END{print n}'      # tulostaa tiedoston ensimmäisen rivin jolla on tekstiä

- awk tuntee myos kierroslaskurin. Tunnetaan for, until, while ja do....whiecho -e '1\n2\n3\n8' | sort -n | awk '{a[i++]=$0;s+=$0}END{print a[0],a[i-1],(a[int(i/2)]+a[int((i-1)/2)])/2,s/i}'le loopit. Myös break, continue ja exit tunnetaan. 
  Kierroslaskurin arvoksi jää sen viimeinen arvo kun kierrokset on tehty tai viimeinen arvo ennen break ja continue lauseita. 
  Esimerkkejä:
  - awk '{ for (i = 0; i <= NF; i++); { printf "("%s ", i);}; printf("\n"); }'  # rivien sanojen luku


awk tuntee printf:n muotoiluineen ja sen voi kirjoittaa print:in paikalle aina. Muotoilu-määreet ovat:
%c 	Tulostaa ASCII-numeroa vastaavan merkin. Esimerkiksi awk 'BEGIN {printf "%c", 65}' tulostaa "A"
%d 	Tulostaa kokonaisluvun
%i 	Tulostaa kokonaisluvunx
%e 	Tulostaa luvun halutussa eksponenttimuodossa. Esimerkiksi printf "%4.3e", 1950 tulostaa: 1.950e+03
%f 	Tulostaa desimaaliluvun
%g 	Tulostaa luvun joko desimaali- tai eksponenttimuodossa sen mukaan, kummassa tarvitaan vähemmän merkkejä
%o 	Tulostaa etumerkittömän oktaaliluvun
%s 	Tulostaa merkkijonon
%x 	Tulostaa etumerkittömän heksaluvun
%X 	Tulostaa etumerkittömän heksaluvun käyttäen desimaaliluvuille 10-15 isoja kirjaimia
- print tulostaa ilmanmuuta tulostettavan perään rivinvaihdon mutta printf ei

awk tuntee muuttujan ARGV jonka jäsen ARGV[1] on luetun tiedoston täysi nimi. Siitä esimerkki ja muutakin kokeilua: 
Tiedostossa ~/taulukko on teksti:
1 2 3
4 5 6
7 8 9
- ja tarkoituksena olisi tulostaa taulukon arvot sekä sarake- ja rivisummat, muotoilla senverran että siitä saa selvää ja tulostaa 
  mistä tiedostosta arvot ovat:
  awk 'BEGIN {print "arvot ovat tiedostosta: "ARGV[1]}; {rivisumma1+=$1;rivisumma2+=$2;rivisumma3+=$3;printf "%s %s %s     sarakesumma= %d\n",$1,$2,$3,$1+$2+$3} END {printf "%s %d %d %d %s","\nrivisummat:\n",rivisumma1,rivisumma2,rivisumma3,"\n\n"}' ~/taulukko



Sekalaisia esimerkkejä:

awk -v q=\' '{print q $0 q }' <<<'test me' #tulostaa: 'test me'   " muuten myös: -v q="'"  onnistuu 

awk '{                                     # rivin jakaminen palasiin jotta ne voisi tulostaa toisessa järjestyksessä
one=substr($0,1,5)
two=substr($0,6,5)
three=substr($0,11,7)
rest=substr($0,19)
printf ("%s (%s) %s %s\n", one, three, two, rest)
}' 

Jos skriptaat runsaammin niin huomaat usei laittavasi tulostamiskäskyn perään: | awk '{print $numero}' . Skriptaamisesi hepottuu ja koodista tulee selvempää jos teet funktion:
function kenttä () { awk '{print $('$(echo $* | sed -e s/-/NF-/g -e 's/ /),$(/g')')}'; }
Tällöin voit kirjoittaaa esimerkiksi: echo a b c d eki f g | kenttä 5 . Myös loppun suhteen negatiiviset arvot toimivat.

- samanmuotoisten matriisien vastinjäsenien yhteenlasku ja tulostus:
  # tiedostoja voi lisätä tai poistaa käskystä muuttamatta missään mitään. Tiedostojen rivi- ja sarakeluku otetaan myös automaattisesti huomioon 
  awk 'FNR==1{cnt=1}
  NF>nf{nf=NF}
  {for(i=1;i<=nf;i++)s[cnt++]+=$i}
  END {for(i=1;i<cnt;i++)printf i%nf?"%d ":"%d\n",s[i]}
  ' ~/tiedosto1 ~/tiedosto2 ~/tiedosto3

- käänteis-matriis<in tekeminen:
awk '
{ 
    for (i=1; i<=NF; i++)  {
        a[NR,i] = $i echo "entten tentten teelikamentten"  | awk '{split($0,a," "); for (i = 1; i <= NF; i++) print a[i]}'
    }
}
NF>p { p = NF }
END {    
    for(j=1; j<=p; j++) {
        apu=a[1,j]
        for(i=2; i<=NR; i++){
            apu=apu" "a[i,j];
        }
        print apu
    }
}'

kuukausinäytön parsiminen:
echo "7.7.2013" | awk 'BEGIN {FS=OFS="."} 
    { 
 if (length($1) == 1) $1="0"$1
 if (length($2) == 1) $2="0"$2
        { print }
}' -> tulostaa 07.07.2013

# matriisin diagonaalin tulostaminen (ylhäältä vasemmalta alas oikealle):
awk '{++f; print $f}' infile > outfile
 

- BASH:in funktioita voi myös käyttää, mutta kummallinen viritys tämä on:x
  echo -n "jotakin" | awk '{ tmp="echo -n " $1 " | openssl md5"; tmp | getline a; print a}'  

- awk '{ if ($0 ~ /\x90/) print "exploit at line " NR }' tiedosto # koodin metsästys tiedostosta joka toimii niillekin kodeille joita ei saa näppäimiltä

- awk 'BEGIN { srand() } { for(i=1;i<=10;i++) print rand(); exit}' # satunnaislukujen tulostus, paina return kahdesti

- awk ei tunnista takaisinpäin-viittauksia. gawk tunnistaa ne,mutta ainoastaan gensub-funktiossa: echo 'noon' | gawk '{print gensub(/(.)(.)/,"\\2\\1","g")} 




Sivuseikkoja, vain minulle muttei foorumille
echo "~/JOKU_KANSIO/{koe1,koe2,koe3}" | awk -F/ '{print $NF}' | tr -d {} |echo -e '1\n2\n3\n8' | sort -n | awk '{a[i++]=$0;s+=$0}END{print a[0],a[i-1],(a[int(i/2)]+a[int((i-1)/2)])/2,s/i}' tr "," " " # tulostaa koe1 koe2 koe3

Awk:in oikeellinen toiminta vaatii joskus käsiteltävältä tiedostolta että sen jokainen rivi on samanlainen; ja samanlainen koneen

awk '{print substr($0, index($0,$N))}'                              # ?  

echo "entten tentten teelikamentten"  | awk '{split($0,a," "); for (i = 1; i <= NF; i++) print a[i]}' # tulosta sanat omille riveilleen

echo 1 | awk {if ($1 % 2 == 0) print "x is even" else print "x is odd"}

echo "mutta jos vain" | awk '{ i = 1; while (i <= 3) { print $i; i++}}'   # tekstijonon jako 

ls foo*.jpg | awk '{print("mv "$1" "$1)}' | sed 's/foo/bar/2' | /bin/sh


Samanmuotoisten matriisien vastinjäsenten yhteenlasku:
BEGIN{OFS="\t";}
{column1[FNR]+=$1;column2[FNR]+=$2;column3[FNR]+=$3;}
END {
for (i in column1) {print i, column1[i], column2[i], column3[i]}
}


 echo "entten tentten teelikamentten"  | awk '{ a[i++] = $0 } END { for (j=i-1; j>=0;) print a[j--] }' ei toimi

 echo "entten tentten teelikamentten"  | awk '{split($0,a," "); for (i = 1; i <= NF; i++) print a[i]}'
n1=5
n2=10
echo | awk -v x=$n1 -v y=$n2 -f program.awk

Assign the value n1 to the variable x, before execution of the program begins. Such variable values are available to the BEGIN block of an AWK program:

BEGIN{ans=x+y}
{print ans}
END{}n1=5
n2=10
echo | awk -v x=$n1 -v y=$n2 -f program.awk

Assign the value n1 to the variable x, before execution of the program begins. Such variable values are available to the BEGIN block of an AWK program:

BEGIN{ans=x+y}
{print ans}
END{}grep -Pow '(?:sin\ .*\ )' teksti | awk '{print $1" "$2}' 

Selvitys ?: rakenteeseen: awk 'ORS=NR%3?",":"\n"' student-marks -> ORS saa arvon , tai \n riippuen siitä onko NR kolmella jaollinen elikkä ei
- siis tarkoituksena on kirjoittaa kolmen opiskelijan tiedot samalle riville pilkku eroittimena, ? ... : ... on siis if-then-else

echo2 ; awk '{ if ($1 % 2 == 0) print "$1 is even"; else  print "$1 is odd" }'
 
Name="kortti"; awk -v name="$Name" '$0 ~ name' tiedosto

grep -Pow '(?:sin\ .*\ )' teksti | awk '{print $1" "$2}' tökkii
grep -Pow '(?:sin\ .*)' teksti | awk '{print $1" "$2}'



    if [[ $1 =~ $regex ]]; then
        echo "$1 matches"
        i=1
        n=${#BASH_REMATCH[*]}


    if [[ $(cat tiedosto) =~ 'kortti' ]]; then echo BASH_REMATCH[1]}; fi
**
filename="myfile.wav"
[[ $filename =~ (.*).wav ]]
echo "${BASH_REMATCH[1]}.mp3"

**

for i in * if [[ $i =~ tiedosto ]];
echo convert ${BASH_REMATCH[1]}.jpg ${BASH_REMATCH[1]}.ps;
done
**
Perättäisten merkkien poistamiseksi tekstistä käsky: tr -s [[:print:]] <<< "$a" ei kelpaa, sillä vaikka se on tehokas niin se ei toimi skandien tai välilyöntien suhteen ja erikoismerkit saavat sen ihan sekaisin. Kaikki muu toimii kyllä käskyllä: cat tiedosto | tr -s [[:print:]] paitsi skandien kanssa se ei toimi sittenkään.

Toimiva toteutus on awk-skripti:
cat tiedosto | awk NF=NF FS= | awk 'BEGIN {FS=ORS=""} { $0=$0"    "; for (n = 1; n <= length($0); n++) if ($(n) != $(n+2)) print $n}' | sed 's/  /\n/g'

- looppaus-kielto koskee yksinomaan BASH:ia ja awk:issa se on ihan OK. Sitäpaitsi awk:issa on vain yksi automaatti-loopi ja tässä tarvitaan kahta. 
- echo:a, printf:ää tai <<< ei voi käyttää mikäli tekstissä on erikoismerkkejä - tai toimivathan ne kun jokaisen erikoismerkin eteen kirjoitetaan keno.
- nopeus on noin sekunti per pari-megabyteä. Pari-megabyteä on suuren kirjan koko.
**

time (cat ohje  | awk NF=NF FS= | awk 'BEGIN {FS=ORS=""} { $0=$0"    "; for (n = 1; n <= length($0); n++) if ($(n) != $(n+2)) print $n}' | sed 's/  /\n/g')
# ei cat output  | awk NF=NF FS= | awk '{for (n in $0) if (n != a) print n; a=n}'
time (awk NF=NF FS= | awk 'BEGIN {FS=ORS=""} { $0=$0"  "; for (n = 1; n <= length($0)-2; n+=2) if ($(n) != $(n+2)) print $n; print "\n"}')<ohje
time (awk 'BEGIN {FS=ORS=""} { $0=$0" "; for (n = 1; n <= length($0)-1; n++) if ($(n) != $(n+1)) print $n; print "\n"}')<ohje
time awk 'BEGIN {FS=ORS=""} {$0=$0" "; for (n = 1; n <= length($0)-1; n++) if ($(n) != $(n+1)) print $n; print "\n"}' ohje
**
Ongelma: tiedoston kentässä 2 voi olla "0 tai 1" taikka "tosi tai epätosi". Alunperin kentässä on joko 1 tai 0 ja ne halutaan muuttaa arvoiksi tosi tai epätosi.
Ratkaisu: awk '{$2=$2=="1" ? "tosi" : "epätosi"}{print $0}'
**
Ongelma: data on seuraavankaltaista:
1234 4334 8677 3753 3453 4554
öö3 >> öö1 3656 2644 0474

1234 4444 8677 3753 3453 4554
4564 öö4 >> öö2 3656 2644 0474
Annetun tagin jälkeinen ryhmä:      haettava=">>"; cat haku3 | awk -F"$haettava" /$haettava/'{print $2}' | awk '{print $1}'
tai annettua tagia edeltävä ryhmä:  haettava=">>"; cat haku3 | awk -F"$haettava" /$haettava/'{print $1}' | awk '{print $NF}'
- tuloste vain ensimmäisestä löydöstä: haettava=">>" ; cat haku3 | awk -F"$haettava" /$haettava/'{print $1; exit}' | awk '{print $NF}'

seq 5 | awk '{printf "%s ", $0} END {print ""}'  # tulostaa: 1 2 3 4 5 ja perään rivinsiirron 

echo -e '1\n2\n3\n8' | sort -n | awk '{a[i++]=$0;s+=$0}END{print a[0],a[i-1],(a[int(i/2)]+a[int((i-1)/2)])/2,s/i}' # laske max,min,keskimmäinen sarvo ja keskiarvo


 





