Skriptit avuksi

Haluaisimme nyt hakea kaikki sanat ensin tiedostossa osa.txt olevasta näytepalasta ja myöhemmin koko tekstiaineistosta, joka meillä on tiedostossa fiwiki.txt. Tämän jälkeen haluaisimme laskea sanoista tilastoja samaan tapaan kuin laskimme edellä otsikoiden alkukirjaimista tilastoja.

Koko rimpsu olisi siis jotain tällaista:

  • haetaan sanat komennolla grep -o

  • tämän tulokseen sovelletaan komentoa awk, jotta saadaan isot kirjaimet pieniksi

  • tämän tulokset järjestetään komennolla sort, jotta saadaan samat sanat peräkkäisille riveille

  • tämän tuloksiin sovelletaan komentoa uniq -c, joka laskee saman sanan esiintymät

  • tämän tuloksiin sovelletaan komentoa sort -n -r, jotta saadaan yleisimmät sanat alkuun.

Sen sijaan, että yritämme kirjoittaa tämän kaiken käsin oikein, tehdään tästä pieni skripti, jota voimme soveltaa mihin tahansa tiedostoon. Luo tiedosto sanat.sh esimerkiksi nano-tekstieditorin avulla. Kirjoita tiedoston alkuun #!/bin/bash, joka kertoo, että tämä skripti on tarkoitus ajaa tutulla bash-komentotulkilla. Tämän jälkeen kirjoitetaan kaikkien ajettavien komentojen rimpsu yhdeksi putkeksi. Tiedoston sanat.sh sisällön pitäisi siis näyttää tältä:

#!/bin/bash

grep -o '[[:alpha:]][[:alpha:]]*' |
    awk '{ print tolower($0) }' |
    sort |
    uniq -c |
    sort -n -r

Tässä siis ensin grep lukee syötettä, se putkitetaan (|) komennolle awk jne. Voisit kirjoittaa koko rimpsun yhdelle riville, mutta |-merkin jälkeen voit myös laittaa rivinvaihdon kuten edellä, jotta skriptiä on helpompi seurata.

Komennolla chmod +x sanat.sh saat tästä sktriptistä ajokelpoisen; nyt skriptin voi käynnistää komennolla ./sanat.sh. Voit kokeilla skriptiä ensin esimerkiksi tiedoston lapio.txt kanssa tähän tapaan (ohjaamme tiedoston lapio.txt skriptille, jolloin se menee skriptissä ensimmäisenä olevan komennon eli grep in käsiteltäväksi):

./sanat.sh < lapio.txt

Ulos pitäisi tulla tilasto, jossa näkyy, että kukin sana esiintyi tässä tekstinpätkässä yhden kerran.

Nyt kokeillaan, mitä tapahtuu, kun sovelletaan tätä näytepalaan osa.txt! Ota tuloste talteen tiedostoon osa-sanat.txt:

./sanat.sh < osa.txt > osa-sanat.txt

Katso näin syntyneen tiedoston osa-sanat.txt alkua. Mitkä ovat kolme yleisintä sanaa tämän listauksen perusteella?

Komennon ajamisessa meni jo tovi. Nopeus riippuu tietysti tietokoneesta, mutta ajoaika tavallisella nykyaikaisella tietokoneella voi olla useita kymmeniä sekunteja. Näytepalassakin on yli sata megatavua tekstiä ja yli kymmenen miljoonaa sanaa. Tämän perusteella voit yrittää arvioida, kuinka kauan kestää koko tekstin käsittelyssä omalla koneellasi!

Kun näytepalan kohdalla tulokset näyttivät suhteellisen järkeviltä, kokeillaan sitten samaa koko tekstiaineistolle:

./sanat.sh < fiwiki.txt > fiwiki-sanat.txt

Skriptin etu tulee tässä hyvin esiin: voit jättää tietokoneen rauhassa laskemaan kahvitauon ajaksi…

Tutki näin syntyneen tiedoston fiwiki-sanat.txt alkua. Voit esimerkiksi käyttää komentoa less tai leikata tiedoston alusta sopivan pätkän head-komennolla tekstieditorissa katsottavaksi. Voit numeroida rivit komennolla cat -n, niin pysyt kärryillä rivinumeroista, ja voit etsiä rivejä komennolla grep.

Etsi tiedostosta sana "ja"; kuinka monta kertaa tämä esiintyi ja millä sijalla se oli?

Entä sana "suomalainen"?

Palautusta lähetetään...