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.

Mitkä ovat koko suomenkielisen Wikipedian otsikoiden 5 yleisintä alkukirjainta, yleisimmästä alkaen?

Mikä osuus suomenkielisen Wikipedian otsikoista alkaa kirjaimella A?

Palautusta lähetetään...