Incrémenter les données (Date) d'un fichier
Résolu
Celine_A
Messages postés
12
Date d'inscription
Statut
Membre
Dernière intervention
-
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
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
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:
- Incrémenter les données (Date) d'un fichier
- Fichier bin - Guide
- Fichier .dat - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
15 réponses
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
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
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 ;)
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 ;)
hello
quelque chose comme ça ?
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
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
001.cmd[63]: BEGIN{FS=OFS=,}: not found
001.cmd[64]: syntax error at line 65 : `(' unexpected
merci
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
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
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
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"}}
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.
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.
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$;-))
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
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
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})
MOIS=$(sed 's/ //g' < ${ISQL_FRES})
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
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
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...
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...
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.
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.
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.