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

Résolu
Celine_A Messages postés 12 Statut Membre -  
dubcek Messages postés 18627 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
Configuration: Windows XP Internet Explorer 6.0

15 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
  2. CELINE_D
     
    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
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
  4. Celine_A Messages postés 12 Statut Membre
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Celine_A Messages postés 12 Statut Membre
     
    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
  7. Celine_A Messages postés 12 Statut Membre
     
    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
  8. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
  9. Celine_A Messages postés 12 Statut Membre
     
    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
  10. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  11. Celine_A Messages postés 12 Statut Membre
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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
  12. Celine_A Messages postés 12 Statut Membre
     
    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
  13. Celine_A Messages postés 12 Statut Membre
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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
      1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        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
  14. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    et un w minuscule pour le while
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      C'est la mise en forme du site qui le met ;-((

      Merci pour l'attention ;-)
      0
      1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        [126]: While: not found
        .cmd[127]: syntax error at line 128 : `do' unexpected

        mais pas là, non ?
        0
      2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Oups, désolé je croyais que ça m'étais destiné ;-(

        En fait ça l'était, mais pas qu'à moi.
        0
  15. Celine_A Messages postés 12 Statut Membre
     
    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
  16. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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