- CS-A0100
- 2. Wikipedia-projekti
- 2.7 Otsikoiden tutkimista: cut, sort, uniq
Otsikoiden tutkimista: cut, sort, uniq¶
Aletaan nyt hiukan tutkia suomenkielisen Wikipedian otsikoita. Millä kirjaimilla artikkelit yleisimmin alkavat?
Meillä on tiedostossa osa-otsikot.txt
näytepalan otsikot. Jokaisella rivillä on alussa merkit =
ja välilyönti ja sen jälkeen alkaa varsinainen otsikko. Otsikon ensimmäinen kirjain on siis rivin kolmas kirjain. Saisimmeko jotenkin kaivettua pelkästään nuo kolmannet kirjaimet?
cut¶
Tällaiseen tiedostojen leikkelyyn sopii työkalu nimeltä cut
. Esimerkiksi cut -c3
hakee jokaiselta riviltä kolmannen merkin ja cut -c3-5
taas hakisi kolmannen, neljännen ja viidennen merkin.
Voisimme siis hakea pelkät alkukirjaimet omaan tiedostoon tähän tapaan:
cut -c3 osa-otsikot.txt > osa-alkukirjaimet.txt
Kokeile, ja käy katsomassa less
-komennolla, miltä tiedosto näyttää! Tarkista myös komennolla wc -l
, että tiedostoissa osa-otsikot.txt
ja osa-alkukirjaimet.txt
on tosiaan saman määrä rivejä.
sort ja uniq¶
Nyt haluaisimme laskea tilastoja näistä alkukirjaimista. Monesti näppärä komentojen pari on sort
ja uniq
. Komento sort
järjestää rivit aakkosjärjestykseen. Komento uniq
puolestaan laskee kuinka monta peräkkäistä samaa riviä tiedostosta löytyy. Kokeillaan näitä pala kerrallaan; ensin järjestäminen:
sort osa-alkukirjaimet.txt > osa-alkukirjaimet-sortattu.txt
Nyt kun katsot tiedostoa osa-alkukirjaimet-sortattu.txt
, alussa on useita rivejä, joissa on "0" (yksi per artikkeli, jonka otsikko alkaa merkillä 0), sen jälkeen useita rivejä, joissa on "1" (yksi per artikkeli, jonka otsikko alkaa merkillä 1) jne.
Ongelmia?
On mahdollista, että sinun koneellasi sort
järjestää rivit eri tavalla, esimerkiksi kirjaimet ennen numeroita. Tämä riippuu koneesi maa-asetuksista (ks. lisää tämän moduulin luvusta Maa-asetukset), mutta tästä ei tarvitse olla huolissaan. Meille riittää, että esimerkiksi kaikki A-kirjaimet löytyvät samasta kasasta.
Sovelletaan tähän nyt sitten komentoa uniq -c
, joka laskee peräkkäisten identtisien rivien määrän:
uniq -c osa-alkukirjaimet-sortattu.txt
Tuloste on tämän tyylinen:
3 0
1251 1
171 2
45 3
32 4
79 5
28 6
31 7
123 8
124 9
449 A
161 B
118 C
111 D
267 E
...
Eli tiedostossa osa-alkukirjaimet-sortattu.txt
esiintyi esimerkiksi 3 kappaletta peräkkäisiä rivejä, joiden sisältö oli "0" ja 449 kappaletta peräkkäisiä rivejä, joiden sisältö oli "A".
Ja kun nämä kaikki tulivat artikkelien otsikoista, voidaankin päätellä, että näytepalassamme oli esimerkiksi 449 Wikipedia-artikkelia, joiden otsikko alkoi kirjaimella A. Nyt aletaan päästä jo lähelle sitä, mitä kaipaamme!
Laitetaan nämä palaset yhteen yhdeksi putkeksi, niin on helpompi kokeilla emmekä huku erilaisiin tilapäistiedostoihin (kokeile!):
cut -c3 osa-otsikot.txt | sort | uniq -c
Mutta mitkä siis olivat yleisimmät alkukirjaimet? Meillä on tulosteessa luku, välilyönti ja kirjain. Haluaisimme nyt järjestää luvut suuruusjärjestykseen. Tämän tekee sort -n
, jossa -n
kertoo, että lajitellaan numeerisesti (kokeile!):
cut -c3 osa-otsikot.txt | sort | uniq -c | sort -n
Nyt viimeisenä onkin kaikkein yleisin ensimmäinen merkki, joka näytepalassa oli näköjään 1. Voidaan vielä kääntää lajittelujärjestys niin, että yleisin tulee ensimmäisenä; sort
lajittelee käänteiseen järjestykseen valitsimella -r
(kokeile!):
cut -c3 osa-otsikot.txt | sort | uniq -c | sort -n -r
Ja keskitytään tässä tavallisimpiin merkkeihin; listataan siis vain 20 ensimmäistä riviä:
cut -c3 osa-otsikot.txt | sort | uniq -c | sort -n -r | head -20
Nyt meillä on suoraan helppo vastaus siihen, mitkä olivat näytepalassa tavallisimmat merkit. Kokeile nyt vastaavaa koko tiedostolle! Muistathan, että hait jo otsikot aiemmin tiedostoon fiwiki-otsikot.txt
.