Online vind je tal van websites waarop je (regionale) informatie over het weer kan raadplegen. Vaak combineren die historische data met voorspellingen voor de nabije toekomst. Zo brengt Buienradar1 met behulp van radar- en sattelietgegevens de actuele neerslag boven Europa in beeld.
We hebben de Buienradar API aangesproken om historische data te downloaden over de hoeveelheid neerslag in verschillende Europese steden. Die informatie zit opgeslagen in het CSV-bestand2 rain.csv3. Elke regel van dat bestand beschrijft één meting van de neerslag op een bepaald tijdstip in een bepaalde stad. Die beschrijving bestaat uit de volgende drie informatievelden die van elkaar gescheiden worden door komma's:
stad waar meting gebeurd is
tijdstip waarop meting gebeurd is (in Unix-tijd4)
gemeten hoeveelheid neerslag (in millimeter)
De eerste regels van het bestand zien er bijvoorbeeld als volgt uit:
Amsterdam,1546297200,230 Amsterdam,1546383600,319 Amsterdam,1546470000,245 Amsterdam,1546556400,424 Amsterdam,1546642800,716 Amsterdam,1546729200,783 Amsterdam,1546815600,43 Amsterdam,1546902000,115 Amsterdam,1546988400,260 Amsterdam,1547074800,464 …
Gevraagd wordt om een bash shell script stats te schrijven waarmee een overzicht kan gegenereerd worden met basisstatistieken over de neerslag voor een bepaalde stad over een bepaalde periode. De naam van de stad moet als argument aan het shell script doorgegeven worden. Daarnaast kan als tweede argument ook nog de padnaam doorgegeven worden van het CSV-bestand met historische data over de neerslag. Als er geen tweede argument wordt doorgegeven, dan moet het shell script de historische data inlezen via stdin.
Het shell script moet naar stdout een overzicht uitschrijven met de volgende informatie:
stad waar metingen gebeurd zijn (CITY)
aantal metingen binnen de gegeven periode waarop de statistieken gebaseerd zijn (COUNT)
kleinste gemeten hoeveelheid neerslag (in millimeter) binnen de gegeven periode (MIN)
grootste gemeten hoeveelheid neerslag (in millimeter) binnen de gegeven periode (MAX)
Het exacte formaat van het overzicht kan afgeleid worden uit onderstaande voorbeeldsessie. Om de periode vast te leggen waarover de statistieken moeten berekend worden, moet het shell script de volgende twee opties met verplicht argument ondersteunen:
optie -s <int>: begintijdstip (in Unix-tijd5) van periode; als deze optie niet gebruikt wordt dan start de periode bij de vroegste meting in de data
optie -e <int>: eindtijdstip (in Unix-tijd6) van periode; als deze optie niet gebruikt wordt dan eindigt de periode bij de laatste meting in de data
Het shell script moet volgende foutafhandeling voorzien:
als het shell script niet de gepaste opties meekrijgt (enkel ondersteuning voor opties -s en -e), als er geen verplicht argument wordt meegegeven met de opties -s en -e, of als er niet één of twee argumenten worden doorgegeven aan het shell script, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stderr en moet het shell script eindigen met exit status 1
als de padnaam van het CSV-bestand dat aan het shell script wordt doorgegeven niet verwijst naar een gewoon leesbaar bestand, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stderr en moet het shell script eindigen met exit status 2
als de argumenten die aan de opties -s en -e wordt meegegeven geen natuurlijke getallen zijn, of als het gegeven eindtijdstip van de periode vóór het gegeven begintijdstip valt, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stderr en moet het shell script eindigen met exit status 3
als er in de data geen metingen van de gegeven stad gevonden worden die binnen de gegeven periode vallen, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stderr en moet het shell script eindigen met exit status 4
Als er zich geen fouten voordoen, dan moet het shell script eindigen met exit status 0.
Onderstaande voorbeeldsessie geeft aan hoe het shell script stats moet kunnen gebruikt worden. Hierbij gaan we ervan uit dat het tekstbestand rain.csv7 zich in de huidige directory bevindt.
$ stats Syntaxis: stats [-s START] [-e EIND] STAD [FILE] $ echo $? 1 $ stats -abc Brussel Syntaxis: stats [-s START] [-e EIND] STAD [FILE] $ echo $? 1 $ stats Brussel xxx stats: het opgegeven bestand bestaat niet of is niet leesbaar $ echo $? 2 $ stats Brussel rain.csv8 CITY: Brussel
COUNT: 364
MIN: 2
MAX: 997 $ stats Brussel < rain.csv9 CITY: Brussel
COUNT: 364
MIN: 2
MAX: 997 $ stats -s 1553209200 Brussel rain.csv10 CITY: Brussel
COUNT:284
MIN: 2
MAX: 997 $ stats -s 1553209200 -e 1562968800 Brussel rain.csv11 CITY: Brussel
COUNT: 114
MIN: 27
MAX: 997 $ stats -e 1562968800 Brussel rain.csv12 CITY: Brussel
COUNT: 194
MIN: 6
MAX: 997 $ stats -s "2019-01-09" Brussel rain.csv13 stats: ongeldige periode $ echo $? 3 $ stats -e "2019-01-09" Brussel rain.csv14 stats: ongeldige periode $ echo $? 3 $ stats -s 1562968800 -e 1553209200 Brussel rain.csv15 stats: ongeldige periode $ echo $? 3 $ stats -s 1646297200 Brussel rain.csv16 stats: geen data voor de opgegeven periode $ echo $? 4