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

Résolu
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
Configuration: Windows XP Internet Explorer 6.0

15 réponses

  1. Contributeur
    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
    1. 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
      1. Contributeur
        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
        1. 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
          1. 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
            1. 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
              1. Contributeur
                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
                1. 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
                  1. Modérateur
                    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
                    1. 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
                      1. Modérateur
                        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
                    2. 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
                    3. 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
                      1. Modérateur
                        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
                      2. Contributeur
                        @jipicyavec $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
                    4. Contributeur
                      hello
                      et un w minuscule pour le while
                      0
                      1. Modérateur
                        C'est la mise en forme du site qui le met ;-((

                        Merci pour l'attention ;-)
                        0
                      2. Contributeur
                        @jipicy[126]: While: not found
                        .cmd[127]: syntax error at line 128 : `do' unexpected

                        mais pas là, non ?
                        0
                      3. Modérateur
                        @dubcekOups, désolé je croyais que ça m'étais destiné ;-(

                        En fait ça l'était, mais pas qu'à moi.
                        0
                    5. 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
                      1. Contributeur
                        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

                        Discussions similaires

                        question pix mot caché

                        7 réponses