Vood ja tabelid: sort, uniq, wc, pr, join
Selles peatükis vaatame, kuidas ridu loendada, sortida, rühmitada ja tabelilaadseks vormida.
Loogika
Kui sul on palju ridu, aitab see peatükk neist kokkuvõtte teha. Tüüpiline töövoog on: sorteeri, koonda, loenda.
Kiirspikker
sortsorteerib riduuniqeemaldab järjestikused duplikaadiduniq -cloendab järjestikuseid duplikaatewc -lloendab riduwc -wloendab sõnujoinühendab kahest failist ühise väljaga readprvormib väljundi printimiseks või veergudesse
Käivita need käsud
printf 'pirn\noun\npirn\nploom\n' > viljad.txt
sort viljad.txt
sort viljad.txt | uniq
sort viljad.txt | uniq -c
echo 'üks kaks kolm neli' | wc -w
printf 'a\nb\nc\n' | wc -l
printf '1 Mari\n2 Jaan\n' > nimed.txt
printf '1 Tartu\n2 Tallinn\n' > linnad.txt
join nimed.txt linnad.txt
pr -2 viljad.txt
Sõnade lugemine ja tõstu muutmine
echo 'Tere tere maailm' | tr '[:upper:]' '[:lower:]' | tr ' ' '\n' | sort | uniq -c
See on klassikaline Unix-laadne voog: teisenda, jaga ridadeks, sorteeri, loenda.
join eeldab tavaliselt, et mõlemad sisendfailid on ühise välja järgi sorditud. pr on kasulik siis, kui tahad väljundit kiirelt veergudesse või printimiseks vormida.
Päris näide: kõige sagedamad sõnad
Kui tahad näha, miks sort | uniq -c | sort -nr on nii klassikaline, siis kasuta näidisandmefaili:
cp data/sample-words.txt sonad.txt
sort sonad.txt | uniq -c | sort -nr | head -n 15
Selle töövoo loogika on:
sorttoob samad sõnad järjestikkuuniq -cloendab järjestikused kordusedsort -nrpaneb suurimad loendused ette
Just see on üks Unix-laadse tekstitöötluse põhivõtteid.
Päris näide: logitasemete kokkuvõte
Fail data/app.log sobib hästi väikese logianalüüsi jaoks.
cut -d ' ' -f 2 data/app.log | sort | uniq -c | sort -nr
Siin:
cut -d ' ' -f 2võtab välja logitasemesort | uniq -cloendab tasemed kokku- tulemuseks saad näiteks
INFO,WARN,ERRORsagedused
See on hea näide, sest siin kohtuvad tekstifilter, väljavõte ja koondamine.
Päris näide: palju ridu ja palju sõnu
Kui tahad kiiresti aru saada, kui suur üks tekstifail on:
wc -l data/sample-text.txt
wc -w data/sample-text.txt
See annab kaks eri mõõdet:
- mitu rida
- mitu sõna
Mõlemad on praktilised, aga nad ei tähenda sama asja.
Päris näide: join
join tundub alguses natuke kuiv, aga ta on väga hea väikeste tabelite ühendamiseks.
printf '1 Tallinn\n2 Tartu\n3 Narva\n' > linnad.txt
printf '1 Harjumaa\n2 Tartumaa\n3 Ida-Virumaa\n' > maakonnad.txt
join linnad.txt maakonnad.txt
Siin:
- mõlemal failil on esimene väli ühine võti
joinühendab sama võtmega read kokku
Oluline detail:
- sisendfailid peavad tavaliselt võtme järgi sorditud olema
Päris näide: pr
Kui tahad kiirelt sõnaloendit veergudesse panna:
head -n 20 data/sample-words.txt | pr -4 -t
Siin:
-4teeb neli veergu-tjätab päise ja jaluse ära
See ei ole tänapäeval kõige sagedasem tööriist, aga väga õpetlik lühikese käsurea vormindusvõttena.
Veel üks väga praktiline näide on nummerdatud loendi panemine mitmesse veergu:
seq -w 0 99 | pr -5 -t
Siin:
seq -w 0 99teeb loendi00kuni99pr -5 -tjagab selle viide veergu
Kui tahad suurema hulga numbreid panna ühele pr loogilisele lehele, siis saab mängida lehepikkusega:
seq -w 0 9999 | pr -8 -t -l 1250
Selle loogika on:
seq -w 0 9999teeb numbrid0000kuni9999-8teeb kaheksa veergu-teemaldab päise ja jaluse-l 1250ütleb, et üheprlehe kõrgus on 1250 rida
Oluline täpsustus:
- see tähendab “üks
prleht” - see ei tähenda automaatselt “üks päris A4 paberileht”
Päris printimisel sõltub tulemus veel fontidest, paberi suurusest ja sellest, kas prindid terminalist, PDF-ist või mõnest muust keskkonnast.
Kui tahad lihtsalt rahulikult mitut veergu eelvaadata, siis väiksem näide on tavaliselt parem:
seq -w 0 199 | pr -8 -t | less
Locale ja sortimine
sort ei tööta alati kõigis keskkondades täpselt ühtemoodi, sest tulemus sõltub ka locale'ist.
See on eriti nähtav täpitähtede puhul.
Näide:
printf 'Õun\nÄmber\nÖö\nUdu\n' > tahed.txt
sort tahed.txt
LC_ALL=C sort tahed.txt
Siin võib juhtuda, et:
- tavaline
sortkasutab sinu keskkonna locale'it LC_ALL=C sort ...sorteerib lihtsama baitide loogika järgi
See tähendab, et sort tulemus ei ole alati "absoluutne tõde", vaid sõltub keskkonnast.
Kui töötled eestikeelset teksti, siis tasub seda meeles pidada.
Minitest
- Loenda faili read.
- Sorteeri sõnaloend tähestiku järgi.
- Loenda, mitu korda iga sõna esineb.
- Proovi
joinabil ühendada kaks väikest faili ühise esimese välja järgi. - Tee
data/app.logfailist logitasemete sagedustabel.