Incrémenter les données (Date) d'un fichier

Résolu/Fermé
Celine_A Messages postés 12 Date d'inscription mardi 8 septembre 2009 Statut Membre Dernière intervention 11 septembre 2009 - 8 sept. 2009 à 14:57
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 11 sept. 2009 à 11:09
Bonjour,

J'ai un fichier généré par un batch, contenant plusieurs données, ci-dessous le format du fichier :
AAAAA,2222222,1555.5,20090908,AZERT
AAAAA,333333333,1775.5,20090908,AZERT
AAAAA,2788956622,15855.5,20090908,AZERT

mon souhait, c'est de copier ce fichier en plusieurs fois, en incrémentant à chaque fois le mois et en gardant les mêmes données.
Résultat souhaité :
AAAAA,2222222,1555.5,201008,AZERT
AAAAA,333333333,1775.5,201008,AZERT
AAAAA,2788956622,15855.5,201008,AZERT

AAAAA,2222222,1555.5,201108,AZERT
AAAAA,333333333,1775.5,201108,AZERT
AAAAA,2788956622,15855.5,201108,AZERT
:
:
j'ai essayé en utilisant la commande AWK, mais je n'ai pas réussi, quelqu'un pourrais m'aider?

Vous remerciant par avance
A voir également:

15 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
8 sept. 2009 à 15:51
hello
j'ai implémenté le fait que si le mois passe de 12 à 1 j'incrémente aussi l'année, sinon il suffit d'enlever le a+=1
 cat a1
AAAAA,2222222,1555.5,20090908,AZERT
AAAAA,333333333,1775.5,20090908,AZERT
AAAAA,2788956622,15855.5,20090908,AZERT 
AAAAA,2222222,1555.5,20091208,AZERT
AAAAA,333333333,1775.5,20091208,AZERT
AAAAA,2788956622,15855.5,20091208,AZERT 
 
$ cat f1.awk
BEGIN{FS=OFS=","};{a=substr($4,1,4);m=substr($4,5,2);j=substr($4,7,2);if(m==12){a+=1;m=0} ; m++;ms=sprintf("%02d",m);$4=a ms j; print $0}

$ awk -f f1.awk < a1
AAAAA,2222222,1555.5,20091008,AZERT
AAAAA,333333333,1775.5,20091008,AZERT
AAAAA,2788956622,15855.5,20091008,AZERT 
AAAAA,2222222,1555.5,20100108,AZERT
AAAAA,333333333,1775.5,20100108,AZERT
AAAAA,2788956622,15855.5,20100108,AZERT 
0
Merci bcp ;)

Au fait, chaque mois, le batch me génère un fichier F1.txt et je voudrais avoir le même fichier pour les mois qui suivent, en copiant F1.txt et en incrémentant le mois. Ces fichiers seront concaténés à la fin :

Si par exemple le mois du fichier d’entrée ou de référence'F1.txt' = 7, je dois créer 5 fichiers pour les mois qui suivent 8, 9 10, 11,12. (ces fichiers vont contenir les mêmes données que le fichier de référence, seul changement concernera 'le mois')
Si le mois du fichier d’entrée = 12, je ne crée aucun fichier, je garde le fichier de référence seulement.
Si le mois du fichier d’entrée = 1, je dois créer 11 fichiers !!!! je ne sais pas si je peux utiliser la boucle While !
je ne suis pas expert en UNIX... je vous remercie pour votre aide ;)
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
9 sept. 2009 à 09:26
hello
quelque chose comme ça ?
$ cat a1
AAAAA,2222222,1555.5,20090808,AZERT
AAAAA,333333333,1775.5,20090808,AZERT
AAAAA,2788956622,15855.5,20090808,AZERT 
$ rm mois*
$ cat f1.awk
BEGIN{FS=OFS=","};
{a=substr($4,1,4);m=substr($4,5,2);j=substr($4,7,2);
for(m1=m+1;m1 <=12;m1++){ms=sprintf("%02d",m1);$4=a ms j; print $0 >> "mois" ms ".txt"}}

$ awk -f f1.awk  < a1
$ more mois*
::::::::::::::
mois09.txt
::::::::::::::
AAAAA,2222222,1555.5,20090908,AZERT
AAAAA,333333333,1775.5,20090908,AZERT
AAAAA,2788956622,15855.5,20090908,AZERT 
::::::::::::::
mois10.txt
::::::::::::::
AAAAA,2222222,1555.5,20091008,AZERT
AAAAA,333333333,1775.5,20091008,AZERT
AAAAA,2788956622,15855.5,20091008,AZERT 
::::::::::::::
mois11.txt
::::::::::::::
AAAAA,2222222,1555.5,20091108,AZERT
AAAAA,333333333,1775.5,20091108,AZERT
AAAAA,2788956622,15855.5,20091108,AZERT 
::::::::::::::
mois12.txt
::::::::::::::
AAAAA,2222222,1555.5,20091208,AZERT
AAAAA,333333333,1775.5,20091208,AZERT
AAAAA,2788956622,15855.5,20091208,AZERT 
0
Celine_A Messages postés 12 Date d'inscription mardi 8 septembre 2009 Statut Membre Dernière intervention 11 septembre 2009
9 sept. 2009 à 11:19
Merci beaucoup;)
Malheureusement, votre programme ne s’exécute pas, ci-dessous le programme et les erreurs :
Programme :

Ligne 62 $ cat ${DFILT}/${NJOB}_375_DONNEES.txt
Ligne 63 BEGIN{FS=OFS=","};
Ligne 64 {
Ligne 65 a=substr($4,1,4);m=substr($4,5,2);j=substr($4,7,2);
Ligne 66 for(m1=m+1;m1 <=12;m1++)
Ligne 67 {
ms=sprintf("%02d",m1);
$4=a ms j;
print $0 >> "mois" ms ".txt"
}
}

$ awk -f f1.awk < ${DFILT}/${NJOB}_375_DONNEES.txt

Erreurs :
==================================================
/home/work/cmd/P1000012.cmd[62]: $: not found
/home/work/cmd/P1000012.cmd[63]: BEGIN{FS=OFS=,}: not found
/home/work/cmd/P1000012.cmd[64]: syntax error at line 65 : `(' unexpected
#-------------------------------------------------------------------------
Il ne trouve pas le fichier « ${DFILT}/${NJOB}_375_DONNEES.txt » pourtant il existe ! y a-t-il pas de problème de syntaxe dans ce que j’ai fait ?

Je vous remercie bcp pour votre aide.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Celine_A Messages postés 12 Date d'inscription mardi 8 septembre 2009 Statut Membre Dernière intervention 11 septembre 2009
9 sept. 2009 à 11:36
J'ai moins d'erreurs maintenant, après avoir supprimer le petit "$" juste avant la commande 'cat':

001.cmd[63]: BEGIN{FS=OFS=,}: not found
001.cmd[64]: syntax error at line 65 : `(' unexpected


merci
0
Celine_A Messages postés 12 Date d'inscription mardi 8 septembre 2009 Statut Membre Dernière intervention 11 septembre 2009
9 sept. 2009 à 12:04
J'ai essayé aussi, d'utiliser la structure 'AWK' déja développée.

programme :

LIBEL=" fichiers...."
AWK_I=$${DFILT}/ENTREE_DONNEES.txt (fichier d'entrée)
AWK_PARAM=""
AWK_O=${DFILT}/SORTIE_DONNEES.txt (fichier de sortie)
AWK_CMD=`CFTMP`
INPUT_TEXT ${AWK_CMD} <<EOF
BEGIN{FS=OFS=","};
{
a=substr($4,1,4);
m=substr($4,5,2);
j=substr($4,7,2);
for(m1=m+1;m1 <=12;m1++)
{
ms=sprintf("%02d",m1);
$4=a ms j;
print $0 >> "mois" ms ".txt"
}
}

exit
EOF
AWK

Erreurs :
1)
nawk: syntax error at source line 3
context is
>>> a=substr(, <<<
nawk: illegal statement at source line 3
nawk: syntax error at source line 4

2)

nawk: syntax error at source line 9
context is
>>> = <<< a ms j;
nawk: illegal statement at source line 9


merci pour votre aide.

Celine
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
9 sept. 2009 à 12:18
dans awk -f f1.awk < donnees
il y a le fichier f1.awk contenant le code awk et les données
affiche le résultat de
cat -A f1.awk

en faisant ceci
iNPUT_TEXT ${AWK_CMD} <<EOF
...
les $ du code awk vont être interpretés, il faut alors remplacer les $ par \$

ce fichier ne doit contenir que
BEGIN{FS=OFS=","};
{a=substr($4,1,4);m=substr($4,5,2);j=substr($4,7,2);
for(m1=m+1;m1 <=12;m1++){ms=sprintf("%02d",m1);$4=a ms j; print $0 >> "mois" ms ".txt"}}
0
Celine_A Messages postés 12 Date d'inscription mardi 8 septembre 2009 Statut Membre Dernière intervention 11 septembre 2009
10 sept. 2009 à 12:37
Merci beaucoup! pour ces informations. j'aurais une autre question, au fait j'ai un fichier contenant "la valeur = MOIS" :

ISQL_FRES=data_mois.dat
ISQL_RES
MOIS=`cat ${ISQL_FRES}`


et quand j'affiche le MOIS, je constate que j'ai un espace avant et après.

#echo "A"${MOIS}"A" resultat : "A 08 A" et le résultat souhaité c'est "A08A"

comment pourrais-je pour supprimer ces espaces "avant" et "après" le mois?

merci pour votre aide.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
10 sept. 2009 à 12:41
Salut,
jp@MDK:~/tmpfs ssh$ MOIS=" 08 "

jp@MDK:~/tmpfs ssh$ echo "${MOIS}"
 08

jp@MDK:~/tmpfs ssh$ echo "A${MOIS}A"
A 08 A

jp@MDK:~/tmpfs ssh$ echo "A${MOIS// }A"
A08A

jp@MDK:~/tmpfs ssh$
;-))
0
Celine_A Messages postés 12 Date d'inscription mardi 8 septembre 2009 Statut Membre Dernière intervention 11 septembre 2009
10 sept. 2009 à 14:03
j'ai fait ceci :

ISQL_FRES=${DFILT}/DATE_MOIS_O1.dat (c'est un fichier contenant "Mois" : 'espace08espace')
ISQL_RES
MOIS=`cat ${ISQL_FRES}`
echo "A${MOIS// }A"

Mais malheureusement, je n'ai pas le résultat attendu :(( ci-dessous le message d'erreur :

=========================================================================
/home/dev/TG100.cmd[105]: "A${MOIS// }A": bad substitution
#-------------------------------------------------------------------------

c'est peut etre faisable avec la commande SED...non?

MERCI 0 VOUS
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
10 sept. 2009 à 14:14
Que renvoie la commande :
cat -A ${ISQL_FRES}


Essaie d'initialiser ta variable MOIS de cette façon :
MOIS=$(sed 's/ //g' < ${ISQL_FRES})
0
Celine_A Messages postés 12 Date d'inscription mardi 8 septembre 2009 Statut Membre Dernière intervention 11 septembre 2009
10 sept. 2009 à 14:39
Yes ;) merci beaucoup! ça marche. est-ce que vous pourriez m'expliquer à quoi correspond s et g ? enfin si vous pourriez m'expliquer l'expression complète... merci à vous...

MOIS=$(sed 's/ //g' < ${ISQL_FRES})
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
10 sept. 2009 à 14:44
s = commande de substitution
g = paramètre de globalité (substituer toutes les occurrences)

D'avantages d'explications sur SED dans la FAQ :
Sed - Introduction à SED - Part I
Sed - Introduction à SED - Part II
Sed - Introduction à SED - Part III
0
Celine_A Messages postés 12 Date d'inscription mardi 8 septembre 2009 Statut Membre Dernière intervention 11 septembre 2009
10 sept. 2009 à 14:54
merci pour votre aide. j'ai une autre question :

après avoir corriger ce problème, je veux maintenant faire une boucle While, qui me permettra d'afficher quelques données.

i=${MOIS}
While [ $i -le $12] tant que i est inférieur à12 je fais l'echo.... et j'incremente le i
do
…….echo" "
…….

i=`expr $i + 1`
done

mais j'ai certainement quelques erreurs de syntaxe, voici le message d'erreur :

[126]: While: not found
.cmd[127]: syntax error at line 128 : `do' unexpected

merci pour l'aide...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
10 sept. 2009 à 15:08
While [ "${i}" -le "12" ]


Il faut des espaces après avant et après les crochets. Il vaut mieux entourer les variables de quotes doubles ainsi que prendre l'habitude de mettre des accolades (principalement quand on veut concaténer des variables).

Le "12" qui n'est pas une variable n'a pas besoin du signe "$" (dollar) propre aux variables du shell. Les quotes doubles sont là par habitude et pour prévenir tout espace au cas ou dans le motif de comparaison.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
10 sept. 2009 à 15:57
avec $12, le bash en tout cas, traite ${1}2, donc si $1 est vide il va comparer le test avec 2 ... joli piège à debugger ...
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
10 sept. 2009 à 15:34
hello
et un w minuscule pour le while
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
10 sept. 2009 à 15:38
C'est la mise en forme du site qui le met ;-((

Merci pour l'attention ;-)
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
10 sept. 2009 à 15:41
[126]: While: not found
.cmd[127]: syntax error at line 128 : `do' unexpected

mais pas là, non ?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024
10 sept. 2009 à 15:44
Oups, désolé je croyais que ça m'étais destiné ;-(

En fait ça l'était, mais pas qu'à moi.
0
Celine_A Messages postés 12 Date d'inscription mardi 8 septembre 2009 Statut Membre Dernière intervention 11 septembre 2009
10 sept. 2009 à 16:17
je vous remercie, plus d'erreur ;), mais ma boucle ne marche tjrs pas ....au fait l'objectif est de générer X fichiers, et pour chaque fichier généré le champs "mois" dois s'incrementer et le nombre de fichiers dépendra principalement du champs "mois" du fichier d'entrée ci-dessous le code complet :

i=${MOIS}
(#fichier d'entrée de départ ${DFILT}/${NJOB}_630_${i}_SORT_CONCAT_F.txt)
while [ $i -le $12 ]
do
NSTEP=${NJOB}_380
# Begin
#-----------------------------------------------------------------------
LIBEL="FICHIERS_MOIS_RESTANTS"
nawk 'BEGIN{ FS=","; OFS=","; s="" }
{ ms long;
m1 long;
a long;
m long;
j long;
{
a=substr($5,1,4);m=substr($5,5,2);j=substr($5,7,2);
#for(m1=m+1;m1 <=12;m1++)
if (m < 12)
{
m1=m+1;
ms=sprintf("%02d",m1);
$5=a ms j;
}}
print $0;
}' \
# à chaque boucle le fichier d'entrée change (le nom n'est pas constant, il dépend de "i")
#à chaque boucle le fichier de sortie est renommé pour qu'il puisse passer en entrée dans le but de générer un autre fichier...
${DFILT}/${NJOB}_630_${i}_SORT_CONCAT_F.txt > ${DFILT}/${NSTEP}_${i}_SORT.txt
i=`expr $i + 1`;

NSTEP=${NJOB}_635
# Begin sort
#-----------------------------------------------------------------------------
LIBEL="POUR RENOMMER LE FICHIER..."
SORT_WDIR=${SORTWORK}
SORT_CMD=`CFTMP`
SORT_I=${DFILT}/${NJOB}_380_${i-1}_SORT.txt
SORT_O=${DFILT}/${NJOB}_630_${i}_SORT_CONCAT_F.txt
NOINFILE=YES
INPUT_TEXT ${SORT_CMD} <<EOF
/COPY
/OUTFILE ${SORT_O}
exit
EOF
SORT

done

je vous remercie par avance.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
11 sept. 2009 à 11:09
un coup d'oeil rapde:

pourquoi ces parenthèses ?
(#fichier d'entrée de départ ${DFILT}/${NJOB}_630_${i}_SORT_CONCAT_F.txt)

enlever le $ devant 12
while [ $i -le $12 ]

protéger le $ avec \$
/OUTFILE ${SORT_O}

c'est quoi se SORT ?
SORT
0