Pages : 1
#1 Le 23/04/2018, à 12:10
- julien01
Script bash fichier NOAA
Bonjour,
Dans le cadre d'une station météo, j'ai l'ensemble de mes données issues de capteurs stockés dans un fichier CSV (une ligne toutes les 5min). Afin de traiter les données météo par des outils existants je souhaiterai pouvoir générer des fichiers de rapport climatique au format NOAA (un rapport mensuel pour chaque mois + un rapport annuel).
Extrait du CSV :
Date;Time;Pressure;Temperature;Humidity;DewPoint;WindChill;Wind_DirectionDeg;Wind_Direction;Wind_Gust;Wind_Speed;Rain_Relative;weather;forecast
20180422;223501;1016;20.4;35;4.42;null;157.0;SSE;0.0;0.0;0.0;null;null
20180422;224001;1016;20.4;36;4.83;null;157.0;SSE;0.0;0.0;0.0;null;null
20180422;224501;1016;20.2;35;4.25;null;157.0;SSE;0.0;0.0;0.0;null;null
20180422;225001;1016;20.1;37;4.95;null;157.0;SSE;0.0;0.0;0.0;null;null
20180422;225501;1016;20.0;38;5.25;null;180.0;S;0.0;0.0;0.0;null;null
20180422;230001;1016;19.9;41;6.26;null;180.0;S;3.2;0.0;0.0;null;null
20180422;230501;1016;20.0;40;5.99;null;180.0;S;0.0;0.0;0.0;null;null
20180422;231001;1016;20.1;38;5.34;null;202.0;SSW;0.0;0.0;0.0;null;null
20180422;231501;1016;20.1;38;5.34;null;157.0;SSE;0.0;1.4;0.0;null;null
20180422;232001;1016;20.0;38;5.25;null;157.0;SSE;0.0;0.0;0.0;null;null
20180422;232501;1016;19.8;38;5.07;null;180.0;S;0.0;0.0;0.0;null;null
20180422;233001;1016;19.6;38;4.89;null;180.0;S;0.0;0.0;0.0;null;null
20180422;233501;1016;19.3;38;4.62;null;180.0;S;0.0;0.0;0.0;null;null
20180422;234001;1016;19.1;39;4.82;null;202.0;SSW;0.0;0.0;0.0;null;null
20180422;234501;1016;18.9;41;5.36;null;191.0;S;0.0;0.0;0.0;null;null
20180422;235001;1016;18.9;42;5.70;null;202.0;SSW;0.0;0.0;0.0;null;null
20180422;235501;1016;18.7;43;5.86;null;191.0;S;1.8;0.0;0.0;null;null
20180423;000001;1016;18.6;43;5.77;null;168.0;SSE;4.7;1.8;0.0;null;null
20180423;000501;1016;18.6;43;5.77;null;191.0;S;1.8;1.8;0.0;null;null
20180423;001001;1017;18.5;44;6.02;null;168.0;SSE;4.0;2.2;0.0;null;null
20180423;001501;1017;18.6;44;6.11;null;202.0;SSW;0.0;1.4;0.0;null;null
20180423;002001;1017;18.5;44;6.02;null;202.0;SSW;0.0;0.0;0.0;null;null
20180423;002501;1017;18.4;44;5.93;null;168.0;SSE;0.0;1.4;0.0;null;null
20180423;003001;1017;18.2;44;5.74;null;157.0;SSE;5.0;2.5;0.0;null;null
20180423;003501;1017;18.0;44;5.56;null;168.0;SSE;1.8;2.5;0.0;null;null
20180423;004001;1017;17.9;45;5.80;null;157.0;SSE;5.4;3.2;0.0;null;null
20180423;004501;1017;17.7;46;5.93;null;202.0;SSW;1.4;1.4;0.0;null;null
20180423;005001;1017;17.6;47;6.15;null;157.0;SSE;5.8;1.4;0.0;null;null
20180423;005501;1017;17.5;47;6.06;null;180.0;S;2.5;1.4;0.0;null;null
20180423;010001;1017;17.3;47;5.88;null;168.0;SSE;2.2;0.0;0.0;null;null
20180423;010501;1017;17.2;49;6.39;null;157.0;SSE;0.0;1.8;0.0;null;null
20180423;011001;1017;17.0;49;6.21;null;135.0;SE;1.8;1.8;0.0;null;null
20180423;011501;1017;17.0;50;6.50;null;157.0;SSE;6.5;3.2;0.0;null;null
20180423;012001;1017;16.9;50;6.41;null;168.0;SSE;0.0;1.4;0.0;null;null
20180423;012501;1017;16.9;51;6.70;null;180.0;S;0.0;2.5;0.0;null;null
20180423;013001;1017;16.8;51;6.60;null;157.0;SSE;1.8;4.0;0.0;null;null
20180423;013501;1017;16.9;51;6.70;null;168.0;SSE;4.7;4.0;0.0;null;null
20180423;014001;1017;16.9;52;6.98;null;157.0;SSE;6.5;4.0;0.0;null;null
20180423;014501;1017;16.8;52;6.89;null;157.0;SSE;5.8;3.2;0.0;null;null
20180423;015001;1017;16.9;52;6.98;null;202.0;SSW;1.4;1.8;0.0;null;null
20180423;015501;1017;16.9;51;6.70;null;168.0;SSE;2.2;3.2;0.0;null;null
20180423;020002;1017;16.8;51;6.60;null;180.0;S;0.0;1.4;0.0;null;null
Exemple de fichier de rapport mensuel NOAA :
MONTHLY CLIMATOLOGICAL SUMMARY for February 12
NAME: Meteo Station CITY: VILLEFRANCHE STATE:
ELEV: 142 m LAT: 46° 02' 12" N LONG: 4° 43' 10" E
TEMPERATURE (°C), RAIN (mm), WIND SPEED (km/h)
HEAT COOL AVG
MEAN DEG DEG WIND DOM
DAY TEMP HIGH TIME LOW TIME DAYS DAYS RAIN SPEED HIGH TIME DIR
------------------------------------------------------------------------------------
01 -0.7 1.1 13:36 -2.5 23:46 0.0 0.0 0.0 9.4 32.8 19:51 NNW
02 -3.8 -2.5 00:01 -5.1 22:46 0.0 0.0 0.0 11.3 31.7 23:46 NNW
03 -5.2 -3.3 14:31 -7.2 08:21 0.0 0.0 0.0 14.7 45.0 22:21 NNW
04 -5.4 -3.0 14:36 -8.2 07:31 0.0 0.0 0.0 15.0 46.4 08:56 NNW
05 -7.3 -0.1 15:41 -13.3 07:46 0.0 0.0 0.0 4.4 20.9 00:56 NNW
06 -5.8 1.3 15:16 -13.2 07:41 0.0 0.0 0.0 8.1 36.0 16:36 NNW
07 -6.6 -2.8 16:06 -9.5 07:46 0.0 0.0 0.0 15.7 49.0 11:36 NNW
08 -6.6 -2.3 15:46 -9.8 23:56 0.0 0.0 0.0 7.5 25.2 02:06 NNW
09 -5.8 2.1 16:06 -12.9 07:31 0.0 0.0 0.0 4.2 42.1 23:21 NNE
10 -3.7 0.3 15:31 -6.2 07:51 0.0 0.0 0.0 16.8 46.4 16:11 NNW
11 -6.3 -3.7 13:06 -8.7 08:06 0.0 0.0 0.0 11.0 33.1 01:26 NNW
12 -5.0 0.4 15:56 -8.8 04:36 0.0 0.0 0.0 9.3 32.0 14:31 NNW
13 -3.8 2.2 15:16 -12.4 06:21 0.0 0.0 0.0 3.0 20.9 00:26 NE
14 0.8 5.1 15:16 -1.9 01:41 0.0 0.0 1.0 1.9 12.6 16:26 NNE
15 3.5 5.9 14:51 0.6 02:06 0.0 0.0 1.0 5.2 31.0 15:06 NNW
16 5.1 8.4 16:11 1.7 21:46 0.0 0.0 1.0 7.1 27.7 12:11 NNW
17 4.6 8.8 13:01 0.7 02:31 0.0 0.0 0.0 2.6 15.8 13:26 N
18 4.2 11.6 16:11 -0.3 23:26 0.0 0.0 0.0 1.3 12.2 13:26 ESE
19 3.0 8.8 16:11 -1.6 23:56 0.0 0.0 1.0 3.1 19.4 13:11 NNW
20 1.9 6.9 15:56 -2.0 01:11 0.0 0.0 1.3 9.4 46.4 13:31 NNW
21 0.4 8.3 16:06 -5.7 07:41 0.0 0.0 0.0 2.6 17.3 16:01 NNE
22 0.5 11.0 16:11 -6.3 07:16 0.0 0.0 0.0 1.4 10.1 12:11 ENE
23 2.9 9.3 14:36 -3.2 07:26 6.1 0.0 0.0 1.6 9.4 14:31 NNE
24 7.1 10.8 15:06 4.1 00:36 4.3 0.0 0.0 0.6 7.6 03:31 NNE
25 8.9 12.9 15:41 6.8 05:56 0.0 0.0 0.0 3.3 16.9 13:06 NNW
26 8.2 11.5 16:11 5.3 23:56 0.0 0.0 0.0 9.2 36.0 16:16 NNW
27 6.0 13.8 16:06 -0.5 07:36 0.0 0.0 0.0 4.9 25.2 12:06 N
28 -1.4 0.7 00:01 -2.8 07:11 0.0 0.0 0.0 0.1 4.7 01:26 ENE
-------------------------------------------------------------------------------------
-0.4 13.8 27 -13.3 5 10.4 0.0 5.3 6.9 49.0 7 N
Max >= 32.0: 0
Max <= 0.0: 7
Min <= 0.0: 22
Min <= -18.0: 0
Max Rain: 1.27 ON 20/02/12
Days of Rain: 5 (> .2 mm) 0 (> 2 mm) 0 (> 20 mm)
Heat Base: 18.3 Cool Base: 18.3 Method: Integration
L'idée serait donc de faire un script en bash qui parse le fichier CSV pour générer le fichier NOAA du mois en cours. J'ai déjà identifier toutes les manière de faire les calculs mais je bloque sur plusieurs choses.
Le plus simple je pense serait que lorsque le script s’exécute il parse le fichier CSV pour le mois en cours et génère les lignes correspondant aux jours présents dans le CSV. (par exemple nous sommes le 23 avril et le CSV contient les données depuis le 1er mars, et bien on génère toutes les lignes de 1 a 23 avec les données calculés et on génère des lignes vides de 24 a 30 - Si en revanche dans le CSV on a que les données du 22 et 23 avril et bien on génère ces lignes là mais ont garde des lignes vides au dessus (de 1 a 21) et dessous (de 24 a 30).
Je bloque sur la manière dont écrire la (les ?) boucle(s) pour cela...
Problème n°2 : Comment faire pour que le tableau ascii soit toujours « droit » , pas de décalage en fonction de la taille des valeurs ?
Merci d'avance pour votre aide
Hors ligne
#2 Le 23/04/2018, à 14:17
- Watael
Re : Script bash fichier NOAA
salut,
2/ printf
1/ ¿ comparer le premier champ de la ligne traitée avec la date incrémentée depuis le premier jour du mois et celle du dernier jour du mois ...?
si ça ne correspond pas la ligne est vide, sinon, traiter les infos.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 23/04/2018, à 14:23
- julien01
Re : Script bash fichier NOAA
1/ Je pensais plus a une boucle non ?
Par exemple pour température maxi (et sont heure) d'un jour, actuellement je fais ceci (j'ai testé avec grep pour trier sur la date en question) :
temp_max=`cat $csv | grep $date | awk -F ";" '{print $4,$1,$2}' | sort -n | sed -n '$p' | awk -F " " '{print $1}'`
temp_max_heure_brut=`cat $csv | grep $date | awk -F ";" '{print $4,$1,$2}' | sort -n | sed -n '$p' | awk -F " " '{print $3}'`
temp_max_h=`echo $temp_max_heure_brut | cut -c1-2`
temp_max_m=`echo $temp_max_heure_brut | cut -c3-4`
temp_max_heure=`echo $temp_max_h:$temp_max_m`
echo "température maxi : $temp_max°C à $temp_max_heure"
Maintenant, comment faire pour faire une boucle qui fait la même chose pour l'ensemble des jours afin que je puisse sortir une ligne par jour avec les valeurs de température max
2/ Je voulais dire pour aligner en fonction des données car par exemple pour la colonne HIGH (température max) les données peuvent être sur 3, 4 ou 5 caractères, idem pour d'autres colonnes et du coup le nombre d'espaces pour aligner sont variable [je sais pas si je suis clair )
Hors ligne
#4 Le 23/04/2018, à 15:10
- erresse
Re : Script bash fichier NOAA
2/ Je voulais dire pour aligner en fonction des données car par exemple pour la colonne HIGH (température max) les données peuvent être sur 3, 4 ou 5 caractères, idem pour d'autres colonnes et du coup le nombre d'espaces pour aligner sont variable [je sais pas si je suis clair big_smile )
C'est à cela que doivent servir les tabulations au lieu des espaces dans la ligne. ("\t" pour une tabulation)
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
Hors ligne
#5 Le 23/04/2018, à 15:14
- julien01
Re : Script bash fichier NOAA
Le problème c'est que dans le fichier original ce n'est pas des tabulations mais bien des espaces
Hors ligne
#6 Le 23/04/2018, à 15:27
- erresse
Re : Script bash fichier NOAA
D'après l'exemple que tu as donné de ton fichier, il n'y a aucune espace dans les données, les champs sont séparés par ; (fichier CSV)...
Et ce que je te suggère, c'est d'insérer des tabulations entre les champs de sortie au lieu d'espaces, pour que les données soient cadrées.
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
Hors ligne
#7 Le 23/04/2018, à 15:34
- julien01
Re : Script bash fichier NOAA
Oui je parlais d'espaces dans le NOAA pas dans le CSV
Je peux essayer avec des tabulations mais je ne suis pas sur que ce soit ce bon format
Hors ligne
#8 Le 23/04/2018, à 16:27
- Watael
Re : Script bash fichier NOAA
printf est beaucoup plus précis que des tabulations.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 23/04/2018, à 16:55
- julien01
Re : Script bash fichier NOAA
La difficulté réside dans le fait que la largeur des données est variable, donc le nombre d'espace aussi
Hors ligne
#10 Le 23/04/2018, à 17:15
- Watael
Re : Script bash fichier NOAA
$ printf '%12s%6s%8s\n' 123 12 12 14567 123 1
123 12 12
14567 123 1
printf est beaucoup plus précis que des tabulations.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 23/04/2018, à 17:29
- julien01
Re : Script bash fichier NOAA
Parfait ! Tésté avec la ligne 1 de mon fichier exemple NOAA :
printf '%2s%6s%6s%8s%6s%8s%6s%7s%6s%6s%6s%8s%6s\n' 01 -0.7 1.1 13:36 -2.5 23:46 0.0 0.0 0.0 9.4 32.8 19:51 NNW
Merci ! Un point résolu
Hors ligne
#12 Le 23/04/2018, à 22:51
- julien01
Re : Script bash fichier NOAA
Pour l'instant j'en suis là, cela fonctionne pour générer une ligne de la journée en cours. Maintenant comment faire pour traiter l'ensemble du mois ?
Je livre le script entier tel qu'il est actuellement :
#!/bin/bash
csv="/home/test/station.csv"
date=`date +%Y%m%d`
heure=`date +%H%M%S`
jour=`date +%d`
mois=`date +%m`
noaa_mois=`LANG=en_GB date '+%B'`
noaa_annee=`date +%y`
noaa_name="test"
noaa_city="Test Station"
noaa_state=""
noaa_elev="200m" # en mètres
noaa_lat="45°46'47\" N"
noaa_long="4°45'46\" E"
# Entête du fichier NOAA
head1=" MONTHLY CLIMATOLOGICAL SUMMARY for $noaa_mois $noaa_annee"
head2=""
head3="NAME: $noaa_name CITY: $noaa_city STATE: $noaa_state"
head4="ELEV: $noaa_elev LAT: $noaa_lat LONG: $noaa_long"
head5=""
head6=" TEMPERATURE (°C), RAIN (mm), WIND SPEED (km/h)"
head7=""
head8=" HEAT COOL AVG"
head9=" MEAN DEG DEG WIND DOM"
head10="DAY TEMP HIGH TIME LOW TIME DAYS DAYS RAIN SPEED HIGH TIME DIR"
head11="------------------------------------------------------------------------------------"
# Calcul de la température minimum et de son heure
temp_min=`cat $csv | grep $date | awk -F ";" '{print $4,$1,$2}' | sort -n | sed -n '1p' | awk -F " " '{print $1}'`
temp_min_heure_brut=`cat $csv | grep $date | awk -F ";" '{print $4,$1,$2}' | sort -n | sed -n 1p | awk -F " " '{print $3}'`
temp_min_h=`echo $temp_min_heure_brut | cut -c1-2`
temp_min_m=`echo $temp_min_heure_brut | cut -c3-4`
temp_min_heure=`echo $temp_min_h:$temp_min_m`
# Calcul de la températrue maximum et de son heure
temp_max=`cat $csv | grep $date | awk -F ";" '{print $4,$1,$2}' | sort -n | sed -n '$p' | awk -F " " '{print $1}'`
temp_max_heure_brut=`cat $csv | grep $date | awk -F ";" '{print $4,$1,$2}' | sort -n | sed -n '$p' | awk -F " " '{print $3}'`
temp_max_h=`echo $temp_max_heure_brut | cut -c1-2`
temp_max_m=`echo $temp_max_heure_brut | cut -c3-4`
temp_max_heure=`echo $temp_max_h:$temp_max_m`
# Calcul de la température moyenne
temp_moy_nb=`cat $csv | grep $date | awk -F ";" '{print $4}' | wc -l`
temp_moy=`cat $csv | grep $date | awk -F ";" '{print $4}' | awk '{S+=$1} END{print S}' | awk '{print $1/'$temp_moy_nb'}' | awk '{printf("%.1f\n", $1);}'`
# Calcul du vent moyen
vent_moy_nb=`cat $csv | grep $date | awk -F ";" '{print $11}' | wc -l`
vent_moy=`cat $csv | grep $date | awk -F ";" '{print $11}' | awk '{S+=$1} END{print S}' | awk '{print $1/'$vent_moy_nb'}' | awk '{printf("%.1f\n", $1);}'`
# Calcul du vent en rafales maximum et de son heure
vent_raf_max=`cat $csv | grep $date | awk -F ";" '{print $10,$1,$2}' | sort -n | sed -n '$p' | awk -F " " '{print $1}'`
vent_raf_max_heure_brut=`cat $csv | grep $date | awk -F ";" '{print $10,$1,$2}' | sort -n | sed -n '$p' | awk -F " " '{print $3}'`
vent_raf_max_h=`echo $vent_raf_max_heure_brut | cut -c1-2`
vent_raf_max_m=`echo $vent_raf_max_heure_brut | cut -c3-4`
vent_raf_max_heure=`echo $vent_raf_max_h:$bvent_raf_max_m`
# Calcul du secteur de vent dominant
vent_secteur=`cat $csv | grep $date | awk -F ";" '{print $9}' | sort -n | uniq -c | sort -n | sed -n '$p' | awk -F " " '{print $2}'`
# Calcul des precipitations totales
#pluie=`cat $csv | grep $date | awk -F ";" '{print $12}' | awk '{S+=$1} END{print S}'`
pluie="0.0"
sortie="$jour $temp_moy $temp_max $temp_max_heure $temp_min $temp_min_heure 0.0 0.0 $pluie $vent_moy $vent_raf_max $vent_raf_max_h:$vent_raf_max_m $vent_secteur"
# Génération du fichier
printf "$head1\r\n"
printf "$head2\r\n"
printf "$head3\r\n"
printf "$head4\r\n"
printf "$head5\r\n"
printf "$head6\r\n"
printf "$head7\r\n"
printf "$head8\r\n"
printf "$head9\r\n"
printf "$head10\r\n"
printf '%s\r\n' "$head11"
printf '%2s%6s%6s%8s%6s%8s%6s%7s%6s%6s%6s%8s%6s\r\n' $sortie
printf '%s\r\n' "$head11"
Ce script me sort bien ceci :
MONTHLY CLIMATOLOGICAL SUMMARY for April 18
NAME: test CITY: Test Station STATE:
ELEV: 200m LAT: 45°46'47" N LONG: 4°45'46" E
TEMPERATURE (°C), RAIN (mm), WIND SPEED (km/h)
HEAT COOL AVG
MEAN DEG DEG WIND DOM
DAY TEMP HIGH TIME LOW TIME DAYS DAYS RAIN SPEED HIGH TIME DIR
------------------------------------------------------------------------------------
23 18.3 25.2 16:00 13.5 06:55 0.0 0.0 0.0 1.2 9.7 18:35 SSE
------------------------------------------------------------------------------------
Hors ligne