Bash/awk

g@555 Messages postés 7 Statut Membre -  
g@555 Messages postés 7 Statut Membre -
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. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    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
    1. g@555 Messages postés 7 Statut Membre
       
      merci beaucoup pour votre aide!
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    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
  3. g@555 Messages postés 7 Statut Membre
     
    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
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    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
    1. g@555 Messages postés 7 Statut Membre
       
      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
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      affiche les données exactes
      donc il faut compléter les heures et les jours ?
      0
    3. g@555 Messages postés 7 Statut Membre
       
      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