Bash/awk

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

  1. Contributeur
    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 ?
    1. oui il faut que je tienne compte si c'est une année bissextile parce que j'ai plusieurs années dans ce fichier...
      1. Contributeur
        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
        $
        1. 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...
        2. Contributeur
          affiche les données exactes
          donc il faut compléter les heures et les jours ?
        3. 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 ...
      2. Contributeur
        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. merci beaucoup pour votre aide!