Bash/awk
g@555
Messages postés
7
Statut
Membre
-
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
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
A voir également:
- Bash/awk
- Bingo bash free - Télécharger - Divers Jeux
- Bash pause ✓ - Forum Shell
- Bash addition - Forum Programmation
- Bash permission non accordée - Forum Shell
- Awk gsub ✓ - Forum Shell
4 réponses
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
g@555
Messages postés
7
Statut
Membre
merci beaucoup pour votre aide!
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 ?
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 ?
oui il faut que je tienne compte si c'est une année bissextile parce que j'ai plusieurs années dans ce fichier...
j'utilise la commande date, ainsi les fins de mois sont ok, j'utilise une date US,
donc M/J/A
essayer:
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
$
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...
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...
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 ...
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 ...