- CS-A0100
- 2. Wikipedia-projekti
- 2.11 Skriptit avuksi
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 pieniksitämän tulokset järjestetään komennolla
sort
, jotta saadaan samat sanat peräkkäisille riveilletämän tuloksiin sovelletaan komentoa
uniq -c
, joka laskee saman sanan esiintymättä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
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…