Bash/awk

Fermé
g@555 Messages postés 7 Date d'inscription mardi 16 avril 2013 Statut Membre Dernière intervention 20 juin 2013 - 16 avril 2013 à 15:28
g@555 Messages postés 7 Date d'inscription mardi 16 avril 2013 Statut Membre Dernière intervention 20 juin 2013 - 25 avril 2013 à 18:48
bonjour,
j'ai un fichier comme celui ci (date en annee/mois/jour - valeur):
...
20001212 5
20001228 5
20001229 4.3
20001230 25.2
20001231 32
etc ....

je cherche une commande en bash, pour que si une date est manquante dans mon fichier
(ici par exemple entre 20001212 et 20001228, il manque des jours) ,
alors il faut ajouter les dates manquantes avec une valeur égale à -999 ???

j'ai essayé avec des conditions if, etc mais je n'ai pas trouvé de solutions ...
merci d'avance

4 réponses

dubcek Messages postés 18767 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 5 mars 2025 5 628
21 avril 2013 à 14:02
essayer
#!/bin/bash

declare -A T2 T3; declare -i S1 i=0
while read DATE X  ; do
        T1[((i++))]=${DATE:0:8}; T2[$DATE]=$X ; T3[${DATE:0:8}]="ok"
done < fichier_dates
S1=$(date -d "${T1[0]:4:2}/${T1[0]:6:2}/${T1[0]:0:4}" +%s)
D3=${T1[0]}
while [ $D3 -le ${T1[((i-1))]} ]; do
        if [ -n "${T3[$D3]}" ]; then
                for n in {00..23}; do echo $D3$n ${T2[$D3$n]}; done;
        else
                for n in {00..23}; do echo $D3$n -999; done; fi
        S1+=86400
        D3=$(date -d "@$S1" "+%Y%m%d")
done
1
g@555 Messages postés 7 Date d'inscription mardi 16 avril 2013 Statut Membre Dernière intervention 20 juin 2013
25 avril 2013 à 18:48
merci beaucoup pour votre aide!
0
dubcek Messages postés 18767 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 5 mars 2025 5 628
16 avril 2013 à 16:07
hello
faut-il tenir compte du nombre exact de jour par mois en fonction de l'année (28/30/31j, bissextile ?) si le "trou" est entre la fin et le début d'un mois ?
0
g@555 Messages postés 7 Date d'inscription mardi 16 avril 2013 Statut Membre Dernière intervention 20 juin 2013
16 avril 2013 à 16:14
oui il faut que je tienne compte si c'est une année bissextile parce que j'ai plusieurs années dans ce fichier...
0
dubcek Messages postés 18767 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 5 mars 2025 5 628
17 avril 2013 à 10:34
j'utilise la commande date, ainsi les fins de mois sont ok, j'utilise une date US,
donc M/J/A
essayer:
$ cat  f2
#!/bin/bash

declare -A T2 ; declare -i S1 i=0
while read DATE X  ; do
	T1[((i++))]=$DATE; T2[$DATE]=$X
done < fichier_dates
D1=${T1[0]} ; D2=${T1[((i-1))]}
S1=$(date -d "${D1:4:2}/${D1:6:2}/${D1:0:4}" +%s)
D3=$D1
while [ $D3 -le $D2 ]; do
	echo -n "$D3 "
	if [ -z ${T2[$D3]} ]; then echo -999; else echo ${T2[$D3]} ; fi
	S1+=86400
	D3=$(date -d "@$S1" "+%Y%m%d")
done

$ ./f2 
20001212 5
20001213 -999
20001214 -999
20001215 -999
20001216 -999
20001217 -999
20001218 -999
20001219 -999
20001220 -999
20001221 -999
20001222 -999
20001223 -999
20001224 -999
20001225 -999
20001226 -999
20001227 -999
20001228 5
20001229 4.3
20001230 25.2
20001231 32
$
0
g@555 Messages postés 7 Date d'inscription mardi 16 avril 2013 Statut Membre Dernière intervention 20 juin 2013
19 avril 2013 à 13:41
en fait, ça ne fonctionne pas, car mes dates sont en annee/mois/jour/heure, je n'ai pas le choix de les mettre en fonction des heures finalement
est ce que c'est possible d'ajouter la dimension heure ?
mais dans mes fichiers, si la journée 20001228 existe par exemple alors toutes les heures existent également.
par contre si une journée manque, alors toutes les heures manquent également et il faut donc que je complete par -999...
merci pour votre aide...
0
dubcek Messages postés 18767 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 5 mars 2025 5 628
19 avril 2013 à 13:44
affiche les données exactes
donc il faut compléter les heures et les jours ?
0
g@555 Messages postés 7 Date d'inscription mardi 16 avril 2013 Statut Membre Dernière intervention 20 juin 2013
19 avril 2013 à 13:53
le fichier est plutôt de cette forme:

2006010100 77.000
2006010101 78.000
2006010102 76.000
2006010103 75.000
2006010104 73.000
2006010105 75.000
2006010106 77.000
2006010107 74.000
2006010108 77.000
2006010109 77.000
2006010110 77.000
2006010111 75.000
2006010112 73.000
2006010113 71.000
2006010114 69.000
2006010115 66.000
2006010116 66.000
2006010117 66.000
2006010118 64.000
2006010119 63.000
2006010120 60.000
2006010121 57.000
2006010122 58.000
2006010123 57.000
2006010200 55.000
2006010201 65.000
2006010202 63.000
.
.
.
donc s'il manque le 20060103 , alors il faudrait que je complete de cette façon:
2006010300 -999
2006010301 -999 etc

Aussi, mes fichiers concernent une année particulière, je ne sais pas si cela est important ?
Car en lançant le script, il ne prend pas en compte que mon fichier va du 2006010100 au 2006123123 par exemple, pourtant D1 et D2 fournissent cette indication ...
0