Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile

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 big_smile )

Hors ligne

#4 Le 23/04/2018, à 15:10

erresse

Re : Script bash fichier NOAA

julien01 a écrit :

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 sad

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 smile
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 smile

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 smile

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