Tallinna Ülikool
Digihumanitaaria tehnoloogiad
Jaagup Kippar
Tallinn 2018
________________
Sisukord
Sissejuhatus 6
Naiste ja meeste arv veebilehelt 7
Andmed veebilehelt 7
Eesnimede eraldamine 9
Ülesandeid 16
Arvude võrdlemine ja esitamine 16
Veel suhteid 17
Ülesandeid 18
Regulaaravaldised 19
Otsing 19
Asendamine 20
Ülesandeid 21
Andmete avaldamine veebis 22
Putty klient 26
Kokkupuuted Linuxi käskudega 27
Sisevõrgu masina veebi vaatamine väljastpoolt 29
Shelli käsurida 31
ls 31
more 31
echo 31
Tulemuse saatmine faili 32
Tekstiredaktor pico 32
Loendamine - wc 33
Read faili algusest ja lõpust 35
Harjutus 37
grep 37
Skriptid, sortimine 38
Harjutus 42
Failide kopeerimine 43
Tulba arvude summa 46
Harjutus 47
Aritmeetilise keskmise leidmine 47
Harjutus 49
curl 49
wget 50
Python 51
split, tükeldamine 52
Muutujad 53
Tingimus 53
Massiiv 54
Harjutus 55
Regulaaravaldised 56
Harjutus 57
Hulgad 57
Harjutus 57
Tehted hulkadega 58
Harjutus 59
Loendamine 61
Pandas 62
Sortimine 63
Rühmitamine 66
Sõnaliikide uuring 67
Tabelite ühendamine 70
Sõnaliikide osakaal 73
Programmikood failis 76
Estnltk 77
Sõnade andmed 77
Veebist andmete lugemine. 78
Kõikidest liikidest sõnade loendamine 79
Harjutus 83
Tähepaarid 87
Abivahendiks Pandas 88
Andmed veebilehel 90
Veebilehe loomine programmikoodi abil 92
Uuritava teksti andmed veebilehel 93
DataFrame veebilehel tabelina 94
Valitud andmed veebilehele 96
Joonised 99
Selgitustekstidega joonis 100
Tulpdiagramm 102
Sektordiagramm 103
Joonis veebist loetud andmete põhjal 104
Käsklus DataFrame tulba küljes 105
Veebilehe loomine andmete põhjal 107
Mitme tunnusega tulpdiagramm 109
Tulbad üksteise peal 110
Järjestatud horisontaalsed tulbad 110
Standardviga tulpdiagrammil 111
Karpdiagramm 112
Karpdiagramm skaleeritud andmetega 113
XY-diagramm 115
Punktid ja joon ekraanil 117
SQL 120
Andmete loomine 120
Andmebaasi loomine 121
Andmebaasi sisenemine 121
Andmetabeli loomine 121
Andmete sisestamine 122
Andmete päring 123
Harjutus 124
Agregaatfunktsioonid 126
Harjutus 127
Andmete muutmine 128
Näited keelekorpuse andmetega 130
Tekstide võrdlus 133
Andmebaasiskeem 140
Sõnaliigipaaride sageduste võrdlus 143
Dokumentide metaandmed 145
Sõnaliikide paarid 147
Sõnaliigipaaride sageduste võrdlus keeleti 148
Harjutus 149
Python ja MySQL 151
Joonis SQL-tabelist tulnud andmete põhjal 153
Sõnaliikide paarid 155
Harjutus 158
Joonis genereeritud veebilehel 160
Andmed mitme emakeele kohta 163
Vastused omaette kataloogis 165
PHP 169
Päring andmebaasist 169
Sisestus kasutajalt 171
Sõnaliigipaarid vastavalt emakeelele 173
Harjutus 174
Sisestus rippmenüüst 178
Sisestatu säilitamine lehel 185
Sessioonimuutuja 187
Andmete lisamine 190
Tekstide võrdlemine 196
Harjutus 201
Kordamisküsimused 206
________________
Sissejuhatus
Kõigeoskajate aeg hakkab tagasi tulema. Või vähemasti tasub oma valdkonna töö juures kasutada mujalt avanenud võimalusi. Humanitaarteadustes kasutatakse digitehnoloogiaid järjest julgemalt ning need pakuvad vähemasti triangulatsioonina võimalusi seniste järelduste kinnitamiseks või kahtluse alla seadmiseks, lähemal uurimisel toovad aga välja uusi ja vahel ootamatuidki seoseid. Siinne tutvustav materjal annab kätte tehnoloogilised vahendid muuhulgas humanitaarvaldkonnas ettetulevate andmetega ümber käimiseks.
Vahel öeldakse, et matemaatika, millega tegelevad matemaatikud, võib olla suhteliselt lihtne - või vähemasti kitsalt piiritletud. Füüsikutel ja mitmesugustel muudel loodusteadlastel tuleb rinda pista juba märgatavalt keerukama matemaatikaga. Nende uuritavatel probleemidel pole sageli küljes selgeid võrrandeid, küll aga on vaja leida lahendusi, kus ka võrrandid vahel kasulikuks osutuvad ning siis tuleb neid sobivalt kombineerida. Näitena tuuakse vastu kaljut paiskuv merelaine, selle käigus mõjuvad jõud ning lendavate piiskade trajektoorid ja ühinemised. Matemaatika aga, millega tegelevad ajaloolased, ühiskonnateadlased, muusikud ja filoloogid võib olla veel märgatavalt komplitseeritum. Samas usinal katsetajal ja süvenejal on selle abil mõndagi võita.
Sama paistab olema digitehnoloogiatega. Informaatikud õpivad esimesel kursusel küllalt selgepiirilisi põhimõtteid ja tehnikaid. Loodusteadlastel on juba esimestel semestritel vaja leida lahendusi küsimustele, millele ei ole head otsest ja mugavat digimaailma lahendust. Humanitaarerialadel tuleb mõnigikord otsida ja kombineerida tehnikaid, et neile vajalikud olukorrad digimaailmale lahendatatavaks teha ning tulemuseks on mõnigikord lahendused, mille puhul “tavalised” informaatikud peavad tüki aega nuputama, et nähtud lahendus tehniliselt läbi hammustada rääkimata sellest, et suurema osa lahenduse sisust ja tähtsusest moodustab selle erialane pool olgu filoloogias, muusikas, ajaloos või mujal.
Siinses õpikus keskendutakse olemasolevate tehnoloogiate kasutamisele humanitaarvaldkonna näidete juures. Mõnigikord jäetakse lihtsustuse huvides märgatav osa vastava vahendi taustast või võimalustest märkimata. See osalt küll takistab detailset süvenemist, kuid kogemused esimeste õppurikursustega näitavad, et vajalikes ja rohkem kasutatud valdkondades jõutakse näidete kaudu ringiga ka tehniliste põhimõteteni - vähemasti sel määral, et õpitud vahendeid suudetakse edukalt oma töös rakendada.
________________
Naiste ja meeste arv veebilehelt
Paari tuttava nimega loetelu puhul võib korraks peale vaadata ning juba ongi teada, mitu mees- ja naishäält lauluseltskonnas on ja sealtkaudu häälte jagunemise ja repertuaari kohta otsuseid teha. Suuremate andmehulkade puhul aga jõuab mingil ajal arvuti kiiruse poolest nobedamalt toimetada. Kui suurte puhul - see iseküsimus. Paarsada või ka paar tuhat nime käsitsi ühekordselt üle vaadata õnnestub tõenäoliselt rutem kui selle jaoks eraldi programmi kirjutama hakata. Tuleb aga sellist kontrolli pidevalt korduvalt teha või tõesti on juba inimeste arv kümnetes tuhandetes, siis võib arvutist märgatavalt kasu olla. Mugavaimal juhul täisautomaatsena, kus algandmete muutuse korral varsti uued tulemused välja arvutatakse ja sellest ka teada antakse. Mõnigikord on aga lihtsam leppida, et arvuti aitab üksikute aeganõudvamate etappide juures ning osa samme tuleb siiski käsitsi läbi teha.
Andmed veebilehelt
Tänapäeval saab märgatava koguse andmeid kätte veebi kaudu. Samas ei pruugi kättesaadav olla edasiseks töötluseks kuigi mugaval kujul - siis tuleb leida kohandamiseks mooduseid. Üsna mitmekülgne moodus on lehelt teksti kopeerimine lihtsasse tekstiredaktorisse (näiteks Notepad, pico), seal sobivate asenduste tegemine ning siis juba vajaliku osa sihtkohta sättimine. Mõni tabel õnnestub ka otse tabelarvutusprogrammi üle tuua - näiteks Tallinna Ülikooli humanitaarteaduste Instituudi töötajate loetelu.
Kui tabelarvutusprogramm tunneb vahekohad ära, siis jõuavad lahtrid veebilehelt lahtriteks arvutustabelisse. Selliste ülekandmiste puhul ei saa kunagi kindel olla, et moodus, mis ühe lehe ja tabelarvutusvahendiga kehtis, kehtiks ka pärast veebilehe kujunduse muutust või arvutustabeli tarkvara versiooniuuendust. Samas digitehnoloogi töö märgatavalt osalt ongi käepäraste võimaluste otsimine ja rakendamine ning kui parasjagu nõndamoodi sobivalt lahenduseni jõuab, siis tasub seda moodust parasjagu pruukida.
Kord andmed käes, tasub neid sobivaks puhastama hakata. Kuna kavas on eesnimede järgi määrata, kui palju millisest soost inimesi nimekirjas leidub, siis loobun muudest tulpadest ning kopeerin esimese tulba andmed uuele lehele. Nagu näha, leiduvad seal nii ees- kui perekonnanimi ning vahele tulevad ka read allüksuste nimedega. Et veebileht vahepeal muutunud, siis ka eri joonistel olevad andmed veidi erinevad.
Vormingu eemaldamiseks on mugav andmed tõsta korraks Notepadi või muude lihtsasse vorminguta redaktorisse ning pärast jälle tagasi. Mõnel tabelarvutusvahendil ka omal olemas vormingute alt käsklus vormingu eemaldamiseks. Andmete ritta sättimiseks tabelarvutusprogrammil olemas sortimiskäsk. Nii tulevad ka näiteks välja kohad, kus sama inimene on mitmel korral tabelis (näiteks eri üksustes)
Eesnimede eraldamine
Soo kindlaks tegemiseks on vaja eraldi eesnime. Kus lähteandmete juures eesnimed eraldi, seal neid nõnda mugav pruukida. Küllalt sageli aga andmete veebilehele paneku puhul pole mõeldud nende edasise automaatkasutuse peale (või isegi püütakse sellest hoiduda) ning siis tuleb sobiva kätte saamiseks eraldi tegutseda.
Inimestel võib olla rohkem kui üks eesnimi. Õnneks vähemasti esimese nime saab siin enamasti eesnimeks lugeda. Perekonnanime puhul tasub jälle viimast otsida. Kus kahe sõnaga piirdutakse, seal on tõenäoline, et ees- ja perekonnanimi on suhteliselt selgelt määratud. Samas mitmesugused üksuste nimed on ka loetelus sees ning nemad enamasti pikemad kui kaks sõna. Nii tasub pikematesse ridadesse ettevaatlikumalt suhtuda ning vajadusel käsitsi korrektiive teha. Mõni kahesõnaline üksus saab ka nimede vahele peitu pugeda, aga nende otsimise juhul tasub juba hinnata, et kui suur osa neid on ning kas meil sellist täpsust vaja, et nende otsimine end ära tasub.
Tabelarvutusprogrammi juures üldjuhul leiab teksti veergudesse paigutamise vahendi, praegusel juhul määran, et tulpade eraldajateks oleksid tühikud sõnade vahel
Nüüd hulk nimesid olemas. Arvuti aga endiselt ei tea, et keda meheks ja keda naiseks pidada - ning vastavat standardfunktsiooni ei kipu ka olema. Õnneks leidub Wikipedias lehekülg mehenimede loendiga, sarnase leiab ka naisenimede kohta. Päris kõiki nimesid küll seal sees ei ole ning mõni nimi võib ka mõlemale sobida, aga mingi enamvähem hinnangu saab niimoodi kätte sellegipoolest. Jällegi peab muidugi mõtlema, et saavutatav täpsus meid rahuldab, aga see küsimus on tarvilik enamvähem iga uuringu juures.
Nimede ühte tulpa saamiseks on üks võimalus kopeerida nad tekstiredaktorisse (nt. notepad++), kus asendada sõnu eraldav miinusmärk reavahetussümboliga. Tavaline notepad ei sobi, sest too ei suuda reavahetusmärki asendusse määrata.
Tulemusena ongi nimed üksteise all ning nood saab tagasi tabelarvutuslehele kopeerida.
Nii õnnestus saada eraldi tabelilehed naise- ja mehenimede tarbeks.
Vaja veel kindlaks teha, et millisest soost otsitav nimi on. Enne pika loetelu juurde minekut katsetame väiksemaga. Lahtritesse E13 kuni E:15 panin kolm mehenime - Siim, Sass, Sander. Uuritava nime panen praegu lahtrisse E11 (Sander). Koostan funktsiooni =COUNTIF(E13:E15; C11), mis siis loeb kokku, et mitu korda tagumine element leidub esimeses loetelus. Kuna nimed ühekordselt, siis leidmise puhul väljastab 1, muidu 0. Et valemit saaks tulpa mööda alla paljundada, siis tulid meestenimede loetelu aadressil reanumbritele dollarimärgid ette - ehk siis E$13:E$15. Nii ongi nime kohta märge olemas, et kas võiks tegemist olla mehega.
Edasi saab nimesid juba suuremast tabelist otsida. Naise- ja mehenimed kumbki eraldi lehele. Nimede järgi tuleb kolm eraldi arvutulpa. Esimene näitab, et kas vastav nimi leidub naistenimede tabelis, teine, et kas meestenimede tabelis ning kolmandas tulbas liidame kahe eelmise väärtused kokku, et kas nimi on nende andmete põhjal selgelt määratud.
=COUNTIF($naisenimed.A$1:A$907;A1)
=COUNTIF($mehenimed.A$1:A$1092 ;A1)
kui arvutusi tehakse Excelis, siis teise lehe poole pöördumine näeb välja =COUNTIF(naisenimed!A$1:A$907;A1)
Kui kahe esimese arvu summaks on 1 (ehk siis on kas naine või mees), siis jah, muidu on midagi kahtlast.
=D1+E1
Tabeli lõppu kannatab olemasoleva teabe põhjal kokkuvõtted koostada:
Isikute (isikutega ridade) arv
=ROWS(A1:A151)
Naiste tulba arvude summa:
=SUM(D1:D151)
Meeste tulba arvude summa
=SUM(E1:E151)
Nullide arv kolmandas tulbas
=COUNTIF(F1:F151; "=0")
Pikema jutu puhul läheb tekst jutumärkide vahele, &-märkide abil ühendatakse osad kokku, märkide ümber on vaja tühikud jätta. Meeste protsendi leidmiseks jagan meeste arvu (B156) isikute üldarvuga (B154).
="Mehi on TÜHI töötajate hulgas (vähemalt) " & ROUND(B156/B154*100) & " protsenti"
Kuna 28 inimese puhul polnud sugu teada, siis ei saa me välistada, et nad on mehed:
="Mehi on TÜHI töötajate hulgas kuni " & ROUND((B154-B155)/B154*100) & " protsenti"
Naiste puhul sarnane arvutus
="Naisi on TÜHI töötajate hulgas " & B155/ B156 & " korda rohkem kui mehi "
Ülesandeid
* Otsi veebileht isikute nimedega. Puhasta välja eesnimed. Märgi punktidena üles, mida ja kuidas tegid.
* Otsi naisenimede loetelu, puhasta nimed välja. Koosta vahend kontrollimaks, kas uuritav nimi leidub loetelus. Näita välja, millised esimeselt lehelt võetud nimed on naisenimed.
* Kuva mitu protsenti lehel olevatest nimedest on naisenimed, mitu protsenti mehenimed, mitu protsenti teadmata.
Arvude võrdlemine ja esitamine
Samadest arvulistest andmetest saab mitmesuguseid näitajaid välja arvutada. Milliseid just, seda tuleb otsustada näitajate kasutusvajaduse järgi. Samas võib sõnastusi valides ja sobivaid kohti rõhutades jätta lugejale samadest andmetest märgatavalt erineva mulje.
Võrdlemisel on levinud andmestikuks 2 x 2 tabel. Praeguses näites siis TLÜ Ühiskonnateatuste instituudis ning Haridusteaduste instituudis töötavate naiste ja meeste arvud.
Naisi
Mehi
Ühiskonnateaduste instituut
53
26
79
Haridusteaduste instituut
61
6
67
114
32
146
Ridu pidi kokku on kummaski instituudis töötavate inimeste arv, veerge pidi kokku naiste ja meeste arv ning all paremas nurgas kõigi isikute arv kahe instituudi peale kokku. Näites arvestame, et kõikide uuritavate inimeste sugu on teada.
Suhet saab arvutada nii üldarvu suhtes, vastavat sugu isikute üldarvu suhtes kui vastava instituudi isikute üldarvu suhtes. Samuti tuleb valida, kas tulemus esitada suhtarvuna või protsendina - viimasel juhul vajalik arv sajaga korrutada.
Suhte üldarvu saan, kui jagan vastava arvu isikute kogusummaga. Näiteks Ühiskonnateaduste instituudi 26 meest moodustavad kahe instituudi uuritud isikute koguarvust 26/146, suhtarvu 0,178 ehk 0,18 ehk 18 protsenti
=C3/$D$5
Ühiskonnateaduste instituudi 26 meest moodustavad kokku 32st mehest 26/32 ehk 0,812 ehk 81 protsenti.
=C3/C$5
Ühiskonnateaduste instituudi 26 meest moodustavad selle inistituudi isikutest 26/79 ehk 33 protsenti
=C3/$D3
Veel suhteid
Suhe algväärtuste vahel
Kui tahan arvude erinevust rõhutada, siis saan näidata mitte väärtuse osakaalu summas, vaid väärtuste omavahelist suhet. Kui märgin, et Ühiskonnateaduste instituudis on naisi 67 protsenti ja mehi 33 protsenti, siis võetakse neid kergemini kui lihtsalt arve. Kui aga kirjutan, et Ühiskonnateaduste instituudis on naisi kaks korda rohkem kui mehi, siis jääb see mõnelegi ehk selgemalt silma. Ja kui sinna juurde märkida, et Haridusteaduste instituudis on naisi kümme korda rohkem kui mehi, siis see võib ehk ka lugeja silmi märgatavalt suurendada.
Suhe osakaalude vahel
Saab välja tuua osakaalude suhte - Ühiskonnateaduste instituudis on mehi 33 protsenti, Haridusteaduste instituudis 9 protsenti. Järelikult seal on Ühiskonnateaduste instituudis on meeste osakaal 3,7 korda suurem.
Suhe algväärtuste suhete vahel
Kõige reljeefsemalt rõhutab erinevusi algväärtuste vaheliste suhete omavaheline suhe - Ühiskonnateaduste instituudis on kaks naist ühe mehe kohta, Haridusteaduste instituudis kümme naist ühe mehe kohta - järelikult Haridusteaduste instituudis on naisi mehe kohta viis korda rohkem. Ehk kui eelnevalt arvasin, et kokkusaamisele tulev inimene on Ühiskonnateaduste instituudist ning tegelikult tuleb ta Haridusteaduste instituudist, siis tõenäosus, et ta on naine, on eelnevast viis korda suurem - ja juba enne oli kaks korda tõenäolisem, et tuleb naine kui et mees - muidugi juhul, kui kohtumisele tulek ei sõltu soost.
Ülesandeid
* Koosta 2x2 tabel veebist leitud andmete põhjal - näiteks uudisvoo kohta: kas autor on naine/mees? kas kommentaare on vähemalt 10?
* Arvuta rea- ja veerusummad ning üldarv, sõnasta mõne arvu kohta neist lause
* Leia osakaalud ridade kaupa, veergude kaupa ning üldarvu suhtes, sõnasta
* Leia kummagis suunas suhted algandmed, sõnasta
* Leia osakaalude suhted, sõnasta
* Leia algandmete suhete suhted, sõnasta, too lugejale selgitav näide.
________________
Regulaaravaldised
Tekstidest sobivate andmete kätte saamiseks aitavad lisaks “tavalisele” otsingukäsule regulaaravaldised. Ehk siis saab määrata, kas otsitakse numbrit sisaldavat sõna, viietähelist sõna, sõna, mille alguses on “a” ja lõpus “o”, või hoopis midagi keerulisemat. Vastavalt vahenditele võib regulaaravaldiste süntaks olla mõnevõrra erinev, kuid võimalused siiski suhteliselt sarnased. Praegused näited tehakse tekstiredaktoriga Notepad++, aga hiljem kasutatakse samu võimalusi näiteks Pythoni programmeerimiskeeles.
Otsing
Katsetuseks loon lause mõnede arvudega. Otsinguaknast valin otsingutüübiks “Regulaaravaldis” ning otsinguterminiks [0-9], ehk siis kantsulgude vahel sümbolid vahemikus nullist üheksani. Vajutades järgmise leidmise nuppu, märgitakse lehel ära esimene number, praegusel juhul siis tekstis “12” sümbol “1”.
Kui märgin otsinguterminiks [0-9]{2}, siis see tähendab, et otsitakse kahte järjestikust numbrit. Praegusel juhul on tekstis selleks vaid arv 12.
Eesti autonumbri leidmiseks saab märkida, et järjest peavad olema kolm numbrit ja kolm tähte [0-9]{3}[A-Z]{3}
Kui luban, et numbrite ja tähtede vahel võib olla tühik, kuid ei pruugi, siis saab avaldise kirjutada kujul [0-9]{3} ?[A-Z]{3}, ehk siis keskel on tühik koos sellele järgneva küsimärgiga. Nii leitakse tekstis olevad mõlemad autonumbrid üles.
Kui küsimärgi asemel oleks pluss, siis oleks lubatud üks või rohkem eelnevat sümbolit (praegusel juhul tühikut). Erimärkidest veel: punkt tähistab ühte suvalist sümbolit. Kui aga otsitakse punkti ennast, siis peab tema ette panema langjoone \. Näiteks punktiga lõppevad sõnad saab kätte kujul [a-z]+\. Kui täpitähti ja numbreid ka arvestada, siis [a-zõäöü0-9]+\. ning suured tähed saab veel omakorda lisada. Või siis kahekohalise päeva ja kuu ning neljakohalise aastaga kuupäeva leiab kujul [0-9]{2}\.[0-9]{2}\.[0-9]{4}
Asendamine
Pikemate tekstide puhul tahetakse lisaks üles leidmisele nende kohtadega ka midagi peale hakata. Tekstiredaktoris on tavalisimaks operatsiooniks asendamine. Näiteks kui soovin kõik autonumbrid asendada anonüümsuse huvides kujule 123ABC, siis see täiesti õnnestub
Näha tulemus pärast asendust:
Asendus võib olla aga ka paindlikum. Kui tahan avaldise osi asenduse juures edaspidi kasutada, siis tuleb need paigutada sulgudesse. Nii on edaspidi võimalik järjekorranumbri järgi viidata sulgude sisule. Praegusel juhul siis saan autonumbri numbrite osale viidata kujul \1, tähtede osale kujul \2, sest nood olid vastavalt esimeste ja teiste sulgude sees. Lasen algse teksti läbi otsinguteminiga
([0-9]{3})([A-Z]{3})
ning asendusega
numbritega \1, tähtedega \2
Tulemuseks on
Ülesandeid
* Leia tekstis a-tähte sisaldavad sõnad
* Leia tekstis .ee-lõpulised veebiaadressid
* Leia tekstis kuupäevad kujul pp.kk.aaaa
* Asenda need kuupäevad kujule aaaa-kk-pp
Andmete avaldamine veebis
Teistele kättesaadavaks tegemiseks tuleb andmefail enamasti vastavasse kausta kopeerida. Windowsi masinate juures on aastaid mugavaks vahendiks olnud WinSCP. Kui vaja faile üles panna ja vaadata, siis enamasti tasub teenusepakkuja juurest uurida järgmised andmed:
kasutajanimi
parool
paigutuskataloog serveris
aadress veebis
Kusjuures kopeerimise sihtkoha serveri ning vaatamiseks veebis väljas oleva serveri aadress ei pruugi kattuda. Järgnevalt näide lihtsa teksti ülespaneku kohta Apache veebiserveris.
*
Sisselogimise järgselt ilmub aken, kus ühel pool näha kohalikud failid ja kataloogid ning teisel pool võrguserveri omad. Veebis nähtav kaust on sageli nimega public_html - aga see võib ka serveri seadetest sõltuda. Levinud on ka näiteks nimed htdocs ning www. Sinna kausta pandud failid võivad olla juba veebis nähtavad. Vastava kausta sisse on mõnigikord kasulik luua oma alamkaustade süsteem, et andmehulga sisse ära ei upuks.
Siin näites teen public_html-i sisse digihumanitaaria tehnoloogiate tarbeks alamkausta dt.
Sinna sisse hiire parema klahviga vajutades uus fail, näiteks nimega tervitus.txt
Faili sisse teade, mida soovida veebis vaadata
Tulemuse vaatamiseks on vaja teada, kust selle veebis leida võib. Tallinna Ülikoolis näiteks õppuritele avatud masina lin2.tlu.ee public_html-kaustas olevad kontod leiab vaatamiseks hoopis aadressilt http://www.tlu.ee/~kasutajanimi/ alt - ehk siis praegune leht järgneval aadressil:
Pärast WinSCP paigaldamist arvaneb rakendusele sisse ehitatud redaktor. Mõne lause kirjutamiseks on see täiesti sobilik, pikemate tekstide kirjutamiseks ja treppimiseks aga sobib mõni andekam tekstiredaktor paremini. Eelistuste alt saab valida, et millise programmi abil teksti kirjutatakse. Siin näites valiti redaktorite alt uus redaktor, otsiti see Program Files kaustast üles Notepad++ nime alt ning nihutati esimeseks.
Kui tekst muuta ja salvestada, siis seda kohe veel uuena veebis ei näe
‘
Uuenenud teksti leiab alles pärast lehe uuesti laadimise nupu vajutamist
.
Putty klient
Üheks lihtsaks kliendiks Windowsi all on putty. Serverisse logides tuleb kõigepealt määrata selle nimi
Edasi küsitakse kasutajanimi ja parool. Ei tasu ehmatada, et paroolitähed kaovad nagu musta auku - kui andmed õiged, siis pärast sisestusklahvi vajutamist lastakse edasi
Siinses näites on serveritega keerulisem. Välisvõrgust otse pääses ainult ülikooli üldserverisse (lin2.tlu.ee). Mitmedki vajalikud programmid on kättesaadavad aga ainult sisevõrgus olevas masinas praktika1.cs.tlu.ee - nii tuleb omakorda edasi liikuda ssh-käskluse abil ning ollaksegi siseserveri käsurea otsas.
Kokkupuuted Linuxi käskudega
pwd (print working directory) ehk asukoht kasutaja masinas - praegusel juhul /home/jaagup
jaagup@praktika1 ~ $ pwd
/home/jaagup
Kausta loomine siseveebis nähtavate failide jaoks
jaagup@praktika1 ~ $ mkdir public_html
Kausta sisse liikumiseks käsklus cd. Veebikausta alla eraldi kaustad aasta, kursuse ja tunni tarbeks, nii ei upu kohe andmetesse ära.
jaagup@praktika1 ~/public_html/2018 $ mkdir dt
jaagup@praktika1 ~/public_html/2018 $ cd dt
jaagup@praktika1 ~/public_html/2018/dt $ mkdir 04kasurida
jaagup@praktika1 ~/public_html/2018/dt $ cd 04kasurida/
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ pwd
/home/jaagup/public_html/2018/dt/04kasurida
Kataloogipuus ülespoole liikumiseks sobib cd ..
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ cd ..
jaagup@praktika1 ~/public_html/2018/dt $ pwd
/home/jaagup/public_html/2018/dt
Pärast siis jälle tagasi
jaagup@praktika1 ~/public_html/2018/dt $ cd 04kasurida/
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $
Faile kannatab luua ka käsureal töötava redaktoriga. Mõnelegi aga on mugavam oma tuttavat kohalikku tekstiredaktorit kasutada ning lasta WinSCP-l või mõnel muul rakendusel faile vajadust mööda kopeerida. Et praktikaserver sisevõrgus, siis tuleb ka siin tunnel luua. Advanced -> Connection -> Tunnel. Linnuke sisse, et soovitakse seda pruukida ning praegusel juhul vahemasinaks lin2.tlu.ee oma kasutajanime ja parooliga
Kui tunnelimasin määratud, siis edasi vaja anda sihtmasina andmed
Esmakordsel ühendumisel võidakse küsida, et kas ikka usaldan pakutavat ühendust - või kahtlustan, et keegi parasjagu tahab pealt kuulata.
Tõsise kahtluse korral on võimalik serveriadministraatori juurde kontrollima minna, et kas näidatavad koodid ikka õiged on.
Pääsen ennist tehtud kataloogidesse ning võin asuda faile looma.
Sisevõrgu masina veebi vaatamine väljastpoolt
Ka sisevõrgus olevas veebiserveris paiknevate failide välisvõrgust vaatamiseks tuleb omaette tunnel luua. Selleks leiab putty vasakust ülanurgast seadete akna ning Connection -> SSH -> Tunnels kaudu saab määrata, et mida mille kaudu kuhu läbi lastakse.
Siin siis suunatakse kohaliku masina (st. mille taga inimene istub) andmed pordist 5555 (laest võetud number, mille poole hiljem pöörduda) tulemüüri taga oleva praktika1.cs.tlu.ee-nimelise masina porti 80 - mille all jookseb sealne veebiserver. Et ise logitakse lin2.tlu.ee-masinasse, siis see on vaheseadmeks.
Brauseris avades tuleb aadressiks määrata localhost:5555 ning sellele järgnev veebiaadress sisevõrguserveris. Kui kõik õnneks läheb, võib kataloogi sisu vaadata.
Pärast sinna faili loomist ja salvestamist näeb brauseris selle sisu.
________________
Shelli käsurida
Kataloogipuus sobivas kohas saab hakata käsureaga tegutsema. Olemasolevate failide loetelu nägemiseks sobib käsklus ls
ls
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ ls
tervitus.txt
Detailsema info kuvamiseks lisatakse võti -l (nagu long).
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ ls -l
total 4
-rw-rw-r-- 1 jaagup jaagup 4 Sep 14 2018 tervitus.txt
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $
Nii paistavad välja faili õigused, faili omanik ja grupi nimi kuhu fail kuulub. Faili suurus baitides (tere puhul iga tähe kohta bait) ning viimane muutmisaeg, nimi ka. Õiguste puhul r tähendab lugemisõigust (read) ning w kirjutusõigust (write). Esimene kolmik on omaniku enese kohta, viimane tähekolmik võõraste kasutajate (nt veebiserver) kohta. Ehk siis praegu kasutaja ise saab faili lugeda ja sinna muutusi salvestada, võõrad võivad ainult lugeda.
more
Faili sisu vaatamiseks sobib käsklus more
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more tervitus.txt
tere
Kui fail juhtub pikem olema, siis hoolitseb more, et korraga tuleks ette ainult ühe lehekülje jagu. Edasi tuleb juba järgmise vajutuse pärast - et ikka jõuaks vajaliku läbi lugeda.
echo
Millegi ekraanile trükkimiseks sobib echo.
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ echo "ahoi"
ahoi
Mitte, et see niisama kuigi kasulik oleks. Kui aga hiljem skriptijuppe kokku panna, siis küll. Ja praegu on ta abivahendiks näitamisel, kuidas käsust saabunud tekst on võimalik faili lõppu lisaks saata. Kaks suurem-kui märki enne failinime ning väljahõigatud tekst saadetaksegi tervitus.txt lõppu
Tulemuse saatmine faili
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ echo "ahoi" >> tervitus.txt jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more tervitus.txt
tereahoi
more abil nägi, et mis seal sees oli.
Teist korda veel lõppu lisades näeb uut ahoi-d järgmisel real, sest lisades lisandus ka reavahetus
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ echo "ahoi" >> tervitus.txt
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more tervitus.txt
tereahoi
ahoi
Kui fail luua või olemasolev üle kirjutada, siis läheb vaja üht >-märki.
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ echo "kuku" > tervitus.txt
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more tervitus.txt
kuku
Terminaliaknas tekstide kirjutamiseks on hulk rakendusi olemas - peab ainult vaatama, et millise on haldur sinna lisanud. Üks lihtsamaid on pico
Tekstiredaktor pico
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ pico tervitus.txt
Nagu allolev õpetus näitab, siis salvestamiseks sobib CTRL+O, hilisemaks väljumiseks CTRL+X
Käsu more abil võib veenduda, et muutus jõudis kohale.
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more tervitus.txt
kuku!
Faili sisu hindamiseks sobib käsk wc (word count). Praegusel juhul siin üks rida, üks sõna ja kokku kuus baiti (hüüumärk ja reavahetus võtavad ka baidi enese alla).
Loendamine - wc
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ wc tervitus.txt
1 1 6 tervitus.txt
Linux pakuba käskluste juurde abi - enamasti võtmega --help
wc puhul võib lugeda, et saab eraldi välja küsida baite ja tähti, samuti sõnade arve.
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ wc --help
Usage: wc [OPTION]... [FILE]...
or: wc [OPTION]... --files0-from=F
Print newline, word, and byte counts for each FILE, and a total line if
more than one FILE is specified. A word is a non-zero-length sequence of
characters delimited by white space.
With no FILE, or when FILE is -, read standard input.
The options below may be used to select which counts are printed, always in
the following order: newline, word, character, byte, maximum line length.
-c, --bytes print the byte counts
-m, --chars print the character counts
-l, --lines print the newline counts
--files0-from=F read input from the files specified by
NUL-terminated names in file F;
If F is - then read names from standard input
-L, --max-line-length print the maximum display width
-w, --words print the word counts
--help display this help and exit
--version output version information and exit
GNU coreutils online help:
Full documentation at:
or available locally via: info '(coreutils) wc invocation'
Uurimiseks veidi pikem fail
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ wc tervitus.txt
2 9 67 tervitus.txt
Kui eraldi määran, et soovin näha nii tähti kui baite, siis selgub, et esimesi on 66, teisi aga 67 - õ võtab utf-8 kodeeringus kaks baiti oma alla.
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ wc -l -w --chars --bytes tervitus.txt
2 9 66 67 tervitus.txt
Käsk wc suudab hakkama saada ka mitme failiga
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more tervitus2.txt
Tere, Mati
Võta pall ka!
Nii kuvatakse iga faili andmed eraldi ning kõik kokku ka.
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ wc *.txt
2 5 28 tervitus2.txt
2 9 67 tervitus.txt
4 14 95 total
Faili loomiseks üks moodus on echo-käsuga kuvada tekst ning suunata see faili.
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ echo "algus kell 10" > teade.txt
Nii kataloogis näha, et üks fail juures ja mida sealt seest leida võib. 1 reavahetus, kolm sõna ja kokku 14 sümbolit
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ wc *.txt
1 3 14 teade.txt
2 5 28 tervitus2.txt
2 9 67 tervitus.txt
5 17 109 total
Metamärgi * abil näen kõiki faile, mis algavad “tervi”-ga ja lõppevad “.txt”-ga
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ wc tervi*.txt
2 5 28 tervitus2.txt
2 9 67 tervitus.txt
4 14 95 total
Read faili algusest ja lõpust
Tervitusfaili sisu
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more tervitus.txt
Tere, Juku
Homme võta rahvastepalli jaoks sinised tossud kaasa!
Viimane rida failist
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ tail -n 1 tervitus.txt
Homme võta rahvastepalli jaoks sinised tossud kaasa!
Viimane rida wc-käsu väljundist.
/jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ wc *.txt | tail -n 1
5 17 109 total
Mitu käsku üheskoos
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more eesnimed.txt
Juku
Kati
Anu
Madis
Mati
järjestatuna
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more eesnimed.txt | sort
Anu
Juku
Kati
Madis
Mati
Kahanevalt järjestatuna
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more eesnimed.txt | sort -r
Mati
Madis
Kati
Juku
Anu
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more eesnimed.txt
Juku
Kati
Anu
Madis
Mati
Kaks viimast nime
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ tail -n 2 eesnimed.txt
Madis
Mati
Alates teisest nimest
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ tail -n +2 eesnimed.txt
Kati
Anu
Madis
Mati
Faili algusots (ehk praegu kogu fail)
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ head eesnimed.txt
Juku
Kati
Anu
Madis
Mati
Kaks esimest
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ head -n 2 eesnimed.txt
Juku
Kati
Ilma kahe viimaseta
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ head -n -2 eesnimed.txt
Juku
Kati
Anu
Harjutus
Sortige eesnimed ning salvestage kaks esimest neist eraldi faili
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more eesnimed.txt | sort | head -n 2 > vastus.txt
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more vastus.txt
Anu
Juku
grep
Tähte a sisaldavad nimed
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more eesnimed.txt | grep a
Kati
Madis
Mati
at- sisaldavad read
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more eesnimed.txt | grep at
Kati
Mati
tähesuurust arvestamata (ignore case)
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ more eesnimed.txt | grep -i a
Kati
Anu
Madis
Mati
ühest failist
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ grep a eesnimed.txt
Kati
Madis
Mati
mitmest failist
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ grep at *.txt
eesnimed.txt:Kati
eesnimed.txt:Mati
tervitus2.txt:Tere, Mati
regulaaravaldis otsingus
jaagup@praktika1 ~/public_html/2018/dt/04kasurida $ grep --basic-regexp "[A-Z][a-z]" *.txt eesnimed.txt:Juku
eesnimed.txt:Kati
eesnimed.txt:Anu
eesnimed.txt:Madis
eesnimed.txt:Mati
tervitus2.txt:Tere, Mati
tervitus2.txt:Võta pall ka!
tervitus.txt:Tere, Juku
tervitus.txt:Homme võta rahvastepalli jaoks sinised tossud kaasa!
vastus.txt:Anu
vastus.txt:Juku
Skriptid, sortimine
Kui käsud muutuvad pikemaks, siis pole neid mugav sageli uuesti sisestada ning vigu kipub ka sealjuures tekkima. Lahenduseks on vajalik käsk või käskude rida faili kirja panna ning vajalikul ajal välja kutsuda. Siin tervituskäsklus failis kirjas ning tööle lükkamisel näeb selle tulemust.
jaagup@praktika1 ~/public_html/2018/dt/05skript $ more tervitus.sh
echo "tere"
jaagup@praktika1 ~/public_html/2018/dt/05skript $ sh tervitus.sh
tere
Järgnevalt majandame laste pikkuste ja masside andmetega. Käsud cat ning more kuvavad mõlemad andmed ekraanile, more ootab iga ekraanitäie järel klahvivajutust, cat-i abil saab nad aga korraga kätte.
jaagup@praktika1 ~/public_html/2018/dt/05skript $ cat viiesklass.txt
eesnimi,pikkus,mass,sugu
Juku,170,45,m
Kati,160,35,n
Mati,160,72,m
Madis,165,53,m
Mati,163,60,m
Katrin,165,43,n
Siim,151,38,m
Martin,159,46,m
Kadri,164,57,n
Katariina,148,35,n
Maria,143,38,n
Marta,169,550,n
Madis,156,65,m
Mihkel,165,69,m
Tiina,170,38,n
Miia,145,68,n
Siim,151,55,m
Juhan,175,110,m
Priit,156,63,m
Kristjan,164,59,m
Kristi,155,53,n
Kristiina,158,62,n
Killu,164,49,n
Mart,170,69,m
Kert,143,36,m
Gert,152,67,m
Lauri,156,53,m
Moonika,164,58,n
Jaanika,165,59,n
Jaanus,164,63,m
Jaan,162,65,m
Sort-käsuga pannakse read tähestiku järjekorda
jaagup@praktika1 ~/public_html/2018/dt/05skript $ sort viiesklass.txt
eesnimi,pikkus,mass,sugu
Gert,152,67,m
Jaan,162,65,m
Jaanika,165,59,n
Jaanus,164,63,m
Juhan,175,110,m
Juku,170,45,m
….
Sama tulemuse saab, kui väljakuvatud andmed torukäsu abil järjekorda sättida
jaagup@praktika1 ~/public_html/2018/dt/05skript $ more viiesklass.txt | sort
eesnimi,pikkus,mass,sugu
Gert,152,67,m
Jaan,162,65,m
Jaanika,165,59,n
Jaanus,164,63,m
Juhan,175,110,m
Juku,170,45,m
Kadri,164,57,n
….
jaagup@praktika1 ~/public_html/2018/dt/05skript $ sort < viiesklass.txt
eesnimi,pikkus,mass,sugu
Gert,152,67,m
Jaan,162,65,m
Jaanika,165,59,n
Jaanus,164,63,m
Juhan,175,110,m
Juku,170,45,m
Kadri,164,57,n
Kahanevasse järjestusse paigutamiseks aitab võti -r (reverse)
jaagup@praktika1 ~/public_html/2018/dt/05skript $ more viiesklass.txt | sort -r
Tiina,170,38,n
Siim,151,55,m
Siim,151,38,m
Priit,156,63,m
Moonika,164,58,n
...
Jaanika,165,59,n
Jaan,162,65,m
Gert,152,67,m
eesnimi,pikkus,mass,sugu
Siin aga näha, et ka tulpade pealkirjad läksid nõnda viimasele kohale - väikesed tähed pandi omaette. Pealkirjarea ette jätmiseks sobib see eraldi välja küsida, tagumine ots ära järjestada ning siis jälle mõlemad osad kokku panna.
Esimene rida failist
jaagup@praktika1 ~/public_html/2018/dt/05skript $ head -n 1 viiesklass.txt
eesnimi,pikkus,mass,sugu
Read alates teisest
jaagup@praktika1 ~/public_html/2018/dt/05skript $ tail -n +2 viiesklass.txt
Juku,170,45,m
Kati,160,35,n
Mati,160,72,m
Madis,165,53,m
Mati,163,60,m
Killu,164,49,n
...
Mart,170,69,m
Kert,143,36,m
Gert,152,67,m
Lauri,156,53,m
Moonika,164,58,n
Jaanika,165,59,n
Jaanus,164,63,m
Jaan,162,65,m
Skriptina kokku pandud - vastusefaili kõigepealt esimene rida ning siis ülejäänud järjestatuna sinna uue faili lõppu juurde.
jaagup@praktika1 ~/public_html/2018/dt/05skript $ more nimesort1.sh
more viiesklass.txt | head -n 1 > vastus.txt
more viiesklass.txt | tail -n +2 | sort >> vastus.txt
Tulemusena näeb faili jõudnud andmeid
jaagup@praktika1 ~/public_html/2018/dt/05skript $ cat vastus.txt
eesnimi,pikkus,mass,sugu
Gert,152,67,m
Jaan,162,65,m
Jaanika,165,59,n
Jaanus,164,63,m
Juhan,175,110,m
Juku,170,45,m
Kadri,164,57,n
Katariina,148,35,n
Kati,160,35,n
Katrin,165,43,n
Kert,143,36,m
Killu,164,49,n
Kristi,155,53,n
Kristiina,158,62,n
Kristjan,164,59,m
Lauri,156,53,m
Madis,156,65,m
Madis,165,53,m
Maria,143,38,n
Mart,170,69,m
Marta,169,550,n
Martin,159,46,m
Mati,160,72,m
Mati,163,60,m
Mihkel,165,69,m
Miia,145,68,n
Moonika,164,58,n
Priit,156,63,m
Siim,151,38,m
Siim,151,55,m
Tiina,170,38,n
Selgitused saab ka skripti abil vastusefaili lisada, siis pärast selgem lugeda, et millega tegu
jaagup@praktika1 ~/public_html/2018/dt/05skript $ more nimesort2.sh
echo "Nimede järjestamise tulemused" > vastus.txt
echo "" >> vastus.txt
more viiesklass.txt | head -n 1 >> vastus.txt
more viiesklass.txt | tail -n +2 | sort >> vastus.txt
jaagup@praktika1 ~/public_html/2018/dt/05skript $ more vastus.txt
Nimede järjestamise tulemused
eesnimi,pikkus,mass,sugu
Gert,152,67,m
Jaan,162,65,m
Jaanika,165,59,n
Jaanus,164,63,m
Käsklusele sort võib öelda ka tulba, mitmenda järgi soovitakse sortida. Tulpadesse jagamisel kasulik määrata tulpade eraldaja, praegusel juhul koma. Ning kolmanda tulba järgi sortmiseks sobib võti -k3,3 (kolmandast alates ja kuni kolmandani). Lõpus olev -n (numeric) tähendab, et järjestatakse arvulise väärtuse järgi, ehk siis 95 < 125, tähestiku järgi vaadataks eelkõige esimest sümbolit
jaagup@praktika1 ~/public_html/2018/dt/05skript $ more viiesklass.txt | sort --field-separator="," -k3,3 -n
eesnimi,pikkus,mass,sugu
Katariina,148,35,n
Kati,160,35,n
Kert,143,36,m
Maria,143,38,n
Siim,151,38,m
Tiina,170,38,n
Katrin,165,43,n
Juku,170,45,m
Martin,159,46,m
...
Harjutus
Koostage skript, mille abil kuvatakse klassi viis kergemat ja viis raskemat õpilast,
lisage tekstina selgitused juurde
Lahendus
jaagup@praktika1 ~/public_html/2018/dt/05skript $ more nimesort3.sh
echo "Klassi viis kergemat" > vastus.txt
echo "" >> vastus.txt
more viiesklass.txt | sort --field-separator="," -k 3,3 -n | head -n 6 >> vastus.txt
echo "" >> vastus.txt
echo "Klassi viis raskemat" >> vastus.txt
echo "" >> vastus.txt
more viiesklass.txt | head -n 1 >> vastus.txt
more viiesklass.txt | tail -n +2 | sort --field-separator="," -k3,3 -n | tail -n 5 >> vastus.txt
jaagup@praktika1 ~/public_html/2018/dt/05skript $ more vastus.txt
Klassi viis kergemat
eesnimi,pikkus,mass,sugu
Katariina,148,35,n
Kati,160,35,n
Kert,143,36,m
Maria,143,38,n
Siim,151,38,m
Klassi viis raskemat
eesnimi,pikkus,mass,sugu
Mart,170,69,m
Mihkel,165,69,m
Mati,160,72,m
Juhan,175,110,m
Marta,169,550,n
Failide kopeerimine
Graafiliselt failide ümber tõstmine tänapäeval ehk levinum. Kui aga neid vaja eraldiseisvas serveris ühe koha pealt hulgem teise paigutada, siis võib käsureavahenditega kiirem või mugavam olla. Samuti kuluvad kopeerimiskäsud ära sobivaid skripte kokku pannes. Järgnev näide tuleb uue töökataloogi ettevalmistamise kokku.
Käsk pwd (print working directory) näitab kausta, kus parajasti ollakse. Siinsete käsureasätete juures osa kataloogist kodukaustast(~) alates näha, mõnel pool aga pwd-käsklus ainsaks mooduseks teada saada, kus jooksev kataloog parajasti on.
jaagup@praktika1 ~/public_html/2018/dt $ pwd
/home/jaagup/public_html/2018/dt
Kataloogis näha kaks alamkataloogi
jaagup@praktika1 ~/public_html/2018/dt $ ls
04kasurida 05skript
Alamkataloogi sisu:
jaagup@praktika1 ~/public_html/2018/dt $ ls 05skript/
nimesort1.sh nimesort3.sh vastus.txt viiesklass.txt
nimesort2.sh tervitus.sh vastus.txt?
Esialgu huvitab meid edasiseks töötluseks sealt fail viiesklass.txt
Ise dt-kataloogis olles loon uue alamkataloogi nimega 06skript
jaagup@praktika1 ~/public_html/2018/dt $ mkdir 06skript
ja veendun selle olemasolus
jaagup@praktika1 ~/public_html/2018/dt $ ls
04kasurida 05skript 06skript
Kopeerin andmefaili uude kataloogi
jaagup@praktika1 ~/public_html/2018/dt $ cp 05skript/viiesklass.txt 06skript/
ja veendun, et see sinna ka kohale jõudis
jaagup@praktika1 ~/public_html/2018/dt $ ls 06skript/
viiesklass.txt
Lähen ise ka vastavasse kausta
jaagup@praktika1 ~/public_html/2018/dt $ cd 06skript/
jaagup@praktika1 ~/public_html/2018/dt/06skript $
cut - tulpade eraldamine
Käsu võimaluste kohta leiab lähemad seletused näiteks Wikipediast
https://en.wikipedia.org/wiki/Cut_(Unix)
Siin mõned katsed käsuga. Kõigepealt meenutame viienda klassi laste andmefaili sisu
jaagup@praktika1 ~/public_html/2018/dt/06skript $ head viiesklass.txt
eesnimi,pikkus,mass,sugu
Juku,170,45,m
Kati,160,35,n
Mati,160,72,m
Madis,165,53,m
Mati,163,60,m
Katrin,165,43,n
Siim,151,38,m
Martin,159,46,m
Kadri,164,57,n
Esimese tulba andmete nägemiseks määran eraldajaks koma (-d “,”) ning teatan, et soovin näha esimest tulpa (-f 1)
jaagup@praktika1 ~/public_html/2018/dt/06skript $ cut -d "," -f 1 < viiesklass.txt
eesnimi
Juku
Kati
Mati
Madis
Mati
Katrin
Siim
Esimese ja kolmanda tulba nägemiseks lihtsalt need tulpade numbrid loetellu
jaagup@praktika1 ~/public_html/2018/dt/06skript $ cut -d "," -f 1,3 < viiesklass.txt
eesnimi,mass
Juku,45
Kati,35
Mati,72
Madis,53
Mati,60
Katrin,43
Siim,38
Võib küsida andmeid ka tähe kaupa - praegul siis esitähed igast reast
jaagup@praktika1 ~/public_html/2018/dt/06skript $ cut -c 1 < viiesklass.txt
e
J
K
M
M
M
K
S
M
paste - tekstide ühendamine
Eraldi faili massid
jaagup@praktika1 ~/public_html/2018/dt/06skript $ cut -d "," -f 3 < viiesklass.txt > massid.txt
ning esitähed
jaagup@praktika1 ~/public_html/2018/dt/06skript $ cut -c 1 < viiesklass.txt > esitahed.txt
Kontroll, et mis faili jõudis
more massid.txt
mass
45
35
72
53
60
43
38
46
57
jaagup@praktika1 ~/public_html/2018/dt/06skript $ more esitahed.txt
e
J
K
M
M
M
K
S
M
paste-abil pannakse failide andmed rida-realt kõrvuti
jaagup@praktika1 ~/public_html/2018/dt/06skript $ paste esitahed.txt massid.txt
e mass
J 45
K 35
M 72
M 53
M 60
K 43
S 38
M 46
K 57
Võtmega (-d “-”) saab tulpade eraldajaks miinusmärk
jaagup@praktika1 ~/public_html/2018/dt/06skript $ paste -d "-" esitahed.txt massid.txt
e-mass
J-45
K-35
M-72
M-53
M-60
K-43
S-38
M-46
Soovides ühe faili ridade andmed ühte ritta kokku, aitab võti (-s).
jaagup@praktika1 ~/public_html/2018/dt/06skript $ paste -s -d "," esitahed.txt
e,J,K,M,M,M,K,S,M,K,K,M,M,M,M,T,M,S,J,P,K,K,K,K,M,K,G,L,M,J,J,J
Tulba arvude summa
Kõigepealt kolmanda tulba andmed
jaagup@praktika1 ~/public_html/2018/dt/06skript $ cut -d "," -f 3 < viiesklass.txt
mass
45
35
72
53
60
43
38
Samuti need olemas juba eraldi masside failis - tail-käsuga hoolitsen, et pealkirjarida ei jääks arvude sisse
jaagup@praktika1 ~/public_html/2018/dt/06skript $ tail -n +2 < massid.txt
45
35
72
53
60
43
38
46
57
35
Arvutuskäsuks sobib bc - ehk siis eelmise käsu väljundist tulnud tehe arvutatakse välja
jaagup@praktika1 ~/public_html/2018/dt/06skript $ echo "3+4" | bc
7
Sama triki abil saab siin tulpade summat arvutada: saabuvad arvud pannakse ühte ritta ning arvude vahele eraldajaks plussmärk
jaagup@praktika1 ~/public_html/2018/dt/06skript $ tail -n +2 < massid.txt | paste -s -d "+"
45+35+72+53+60+43+38+46+57+35+38+550+65+69+38+68+55+110+63+59+53+62+49+69+36+67+53+58+59+63+65
Sellele otsa veel bc-arvutuskäsklus ning summa ongi käes.
tail -n +2 < massid.txt | paste -s -d "+" | bc
2233
Harjutus
* Kirjutage lause nõnda, et masside andmed võetakse otse failist viiesklass.txt ning leitakse masside summa
lahendus
tail -n +2 vastus.txt
echo "" >> vastus.txt
echo "Teise tulba arvude summa: " >> vastus.txt
echo `tail -n +2 <$1 | cut -d "," -f 2 | paste -s -d "+" | bc` >> vastus.txt
curl
Üksiku faili küsimine veebist
jaagup@praktika1 ~/public_html/2018/dt/06skript $ curl http://www.tlu.ee/~jaagup/andmed/muu/5klass.txt
eesnimi,pikkus,mass,sugu
Juku,170,45,m
Kati,160,35,n
Mati,160,72,m
Madis,165,53,m
Mati,163,60,m
Katrin,165,43,n
Mida võib endiselt edasi töödelda teiste käskudega
curl http://www.tlu.ee/~jaagup/andmed/muu/5klass.txt | cut -d "," -f 3
mass
45
35
72
53
60
43
wget
Rekursiivne (linkide järgi) failikogumiku alla laadimine. Võti (-r), rekursiivne näitab, et minnakse viidete sisse, (-l 2) ehk level 2, et piirdutakse teise taseme viidetega.
wget -r -l 2 http://www.tlu.ee/~jaagup/andmed/muu/
Tekkis kataloog nimega www.tlu.ee, mille sisse paigutati sobivad failid
jaagup@praktika1 ~/public_html/2018/dt/06skript/hoidla $ ls -l
total 4
drwxrwxr-x 4 jaagup jaagup 4096 Sep 25 10:32 www.tlu.ee
________________
Python
Shelli skriptid on failidega töötamiseks levinud ja mugavad. Kui tahta andmestiku detailide kallal pikemalt nokitseda, siis selleks on “päris” programmeerimiskeeled levinumad ja mugavamad. Ehkki - mugav on enamasti see, millega rohkem harjunud oled ning ka käsureaskriptide abil saab faili üksikute ridade kaupa ette võtta ning tingimuste järgi määrata, mida kusagil ette võtta.
Märgatav osa programmeerimiskeeli nõuab, et kõigepealt tuleb käskudest kood valmis kirjutada, siis masinale arusaadavaks kompileerida ning alles seejärel võib käivitama ja tulemusi vaatama hakata. Pythoni teeb muuhulgas alustajale mugavaks võimalus käske kohe ka ühekaupa käivitada ja tulemusi vaadata.
Pythoni keele kohta seletavaid materjale algajatele leiab näiteks TLÜ õppejõud Inga Petuhhovi veetava Programmeerimise algkursuse lehelt http://www.cs.tlu.ee/~inga/progbaas/
Interpretaatori käivitamiseks tuleb käsureal sisestada selle nimi - siinses näitmasinas on selleks käsklus python3.5.
jaagup@praktika1 ~/public_html/2018/dt $ python3.5
Python 3.5.1+ (default, Mar 30 2016, 22:46:26)
[GCC 5.3.1 20160330] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
Edasi võib ükshaaval korraldusi jagada. Alustuseks lihtne liitmistehe, millele arvuti kuvab ka kohe vastuse
>>> 3+2
5
Sama tulemuse saab, kui paluda töö tulemus print-käsu abil välja kuvada.
>>> print(3+2)
5
Käsureal käivitades kuvatakse tulemus välja, kui sellele muud ülesannet pole antud. Tekstid tuleb paigutada jutumärkide või ülakomade vahele. Ja ka ühe väärtuse sisestamine on käsk, mille tulemus trükitakse välja
>>> "Tere"
'Tere'
Tekst on Pythoni jaoks ühtlasi tähtede kogum. Loendamist alustatakse nullist. Esimese tähe väljatrükk
>>> "Tere"[0]
'T'
Pikema tekstilõigu puhul tuleb märkida, et kust alates ja kuhuni trükitakse. Kusjuures vahed on nummerdatud vastavate tähtede eest
|T|e|r|e|
0 1 2 3 4
>>> "Tere"[0:2]
'Te'
andis siis tulemuseks kaks esimest tähte.
Python võimaldab ka lõpuotsast küsida
>>> "Tere"[-1]
'e'
annab tulemuseks teksti viimase tähe
Tähtede arv sõnas käsuga len
>>> len("Tere")
4
Ning veidi nagu naljanumbrina saab tekste ka arvuga korrutada
>>> 5*"Tere"
'TereTereTereTereTere'
split, tükeldamine
Teksti puhul sai kantsulgudes oleva järjekorranumbri abil pöörduda üksikute tähtede poole. Pöördutavaks üksuseks võib olla aga ka midagi muud, näiteks sõnad. Käsklus split muudab teksti massiiviks, sulgudes oleva jutumärkides/ülakomades sümboli(te) abil näidatakse, et mille kohalt tekst tükeldatakse.
>>> "Juku tuli kooli".split(' ')
['Juku', 'tuli', 'kooli']
Jällegi algab loendamine nullist.
>>> "Juku tuli kooli".split(' ')[0]
'Juku'
Miinusmärgi abil võib lõpust lugeda
>>> "Juku tuli kooli".split(' ')[-1]
'kooli'
ning len näitab, mitmest osast kogum koosneb.
>>> len("Juku tuli kooli".split(' '))
3
Et lugemist alati nullist, siis teine sõna on järjekorranumbriga 1
>>> "Juku tuli kooli".split(' ')[1]
'tuli'
Teisest alates kuni lõpuni kirjutatakse arv üks koos sellele järgneva kooloniga
>>> "Juku tuli kooli".split(' ')[1:]
['tuli', 'kooli']
Muutujad
Enamikes programmeerimiskeeltes saab (vahe)tulemusi meelde jätta märksõnade ehk muutujate (variable) abil, nii võimalik neid hiljem sobivas kohas jälle pruukida
>>> vanus=5
>>> vanus
5
>>> print(vanus)
5
Arvutades käituvad nad nagu tavalised väärtused
>>> vanus+1
6
>>> print(vanus)
5
Tehte tulemusena saab aga arvutada uue väärtuse ning selle siis muutujasse salvestada
>>> vanus=vanus+1
>>> vanus
6
Tingimus
Vastavalt tingimusele kannatab programmeerimiskeeles valida, mida tehakse või väljastatakse. Siinses näites väljastatakse kuuest eluaastast suurema vanuse korral, et tegemist on koolilapsega, muul juhul on käsu väljundiks lihtsalt laps
>>> "koolilaps" if vanus>6 else "laps"
'laps'
Suurema vanuse korral ka vastus teistsugune
>>> vanus=8
>>> "koolilaps" if vanus>6 else "laps"
'koolilaps'
Massiiv
Teksti sai massiiviks muuta split-käskluse abil. Väärtused saab aga massiivi ka otse sisse anda. Loetelu ümber kandilised sulud ning elementide vahele komad. Praegusel juhul elementideks täisarvud
>>> vanused=[5, 6, 8, 11]
>>> vanused
[5, 6, 8, 11]
Taas saab neid järjekorranumbri järgi küsida. Olgu algusest
>>> vanused[0]
5
või lõpust
>>> vanused[-1]
11
Elementide arv ka samamoodi
>>> len(vanused)
4
Pythoni omapäraks on võimalus massiivi sees elemente lühidalt ümber arvutada. Järgnev käsklus loob vana põhjal uue massiivi, kus iga lapse vanus on ühe aasta jagu suurem. Tsüklikäsklus for käib ükshaaval läbi vanuste massiivi elemendid. Iga ringi juures saab vanus konkreetse lapse vanuse väärtuse ning uude väljastatavasse massiivi jäetakse endisest ühe võrra suurem väärtus
>>> [vanus+1 for vanus in vanused]
[6, 7, 9, 12]
vanuste massiiv ise aga jäi endiseks
>>> vanused
[5, 6, 8, 11]
Korduse ja tingimuse saab ka kokku panna - et millise vanuse juures on inimene lihtsalt laps ja millal koolilaps
>>> ["koolilaps" if vanus>6 else "laps" for vanus in vanused]
['laps', 'laps', 'koolilaps', 'koolilaps']
Harjutus
* Koosta lause, pane muutujasse
* split-käsu abil paiguta lause sõnad massiivi
* Kuva lause viimane sõna
* Kuva lause viimase sõna pikkus
* Koosta uus massiiv, kus igaks elemendiks on lause vastava sõna tähtede arv
lahendus
>>> lause="Juku tuli kooli"
>>> m=lause.split()
>>> m[-1]
'kooli'
>>> len(m[-1])
5
>>> pikkused=[len(sona) for sona in m]
>>> pikkused
[4, 4, 5]
Mõned täiendavad näited harjutuse juurde.
Uue massiivi loomise tsüklit saab rakendada ka värskelt split-käsuga loodud massiivile
>>> [len(sona) for sona in "Juku tuli kooli".split()]
[4, 4, 5]
Loomistsükkel ilma andmeid muutmata
>>> [sona for sona in "Juku tuli hommikul kooli".split()]
['Juku', 'tuli', 'hommikul', 'kooli']
juurde tingimus, et loetellu jäävad alles vaid neljast tähest pikemad sõnad
>>> [sona for sona in "Juku tuli hommikul kooli".split() if len(sona)>4]
['hommikul', 'kooli']
len-käsu abil nende pikkused
> [len(sona) for sona in "Juku tuli hommikul kooli".split() if len(sona)>4]
[8, 5]
mitu käsku kokku pannes on tulemuseks lauses olevate neljast pikemate sõnade tähtede arvu summa
> sum([len(sona) for sona in "Juku tuli hommikul kooli".split() if len(sona)>4]
13
Regulaaravaldised
Kasutada saab neid mitme keele ja vahendi sees, põhiomadused on enamikes paikades sarnased. Pythonis on nende pruukimiseks mugavaks mitmekülgseks käskluseks findall paketist re (regular expressions). Näitena numbrid tekstist
>>> import re
>>> re.findall("[0-9]", "2 kassi ja 3 koera")
['2', '3']
Kui otsinguks on sümbol loetelust null kuni üheksa, siis näidatakse arvu 12 numbrid eraldi
>>> re.findall("[0-9]", "12 kassi ja 3 koera")
['1', '2', '3']
Plussmärk teatab, et otsitakse järjestikust üht või rohkemat sümbolit ning sellisel juhul tuleb arv 12 kokku.
>>> re.findall("[0-9]+", "12 kassi ja 3 koera")
['12', '3']
Ülakomad leitud vastete ümber tähendavad, et tulemused on tekstitüüpi. Neid arvutamiseks kasutades on nad vaja enne arvuks muuta. Teksti muudab täisarvuks käsklus int (sõnast integer). Käsklus map võimaldab käsu rakendada massiivi kõigile liikmetele. map-i tulemus välja trükkides väljastatakse lihtsalt objekti aadress - ehkki soovitud andmed on seal sees. Nende nägemiseks ilmutatud kujul sobib käsklus list.
>>> map(int, re.findall("[0-9]+", "12 kassi ja 3 koera"))