Shell - changer le format d'une date dans un fichier

Résolu
diaz1212 Messages postés 6 Statut Membre -  
diaz1212 Messages postés 6 Statut Membre -
Bonjour,
j'ai deux champs contenant des dates que je souhaite formater YY/MM/DD au lieu de YYYYMMDD. Pouvez vous svp m'aider sur cette problématique, ci-dessous le format du fichier:

20170701;4575;58;;test;toto;20170604;titi;tata;;000;
20170702;4576;588;d;test2;toto;20170654;titid;tatad;;000;

merci d'avance pour votre aide

6 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    $ sed -r 's+(..)(..)(..)+\2/\3/+' fichier
    17/07/01;4575;58;;test;toto;20170604;titi;tata;;000;
    17/07/02;4576;588;d;test2;toto;20170654;titid;tatad;;000;
    1
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    enlever le g du sed ou utiliser awk pour spécifier un No de champ
    $ sed 's+\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)+\2/\3/+' fichier
    0560;AAAAAA;17/06/23;BBBBBBBBBBBB;CCCCCCCCCC;FFFFFFFFFF;FFFF;ERTRER;2000;950.0000000;0,0;0,0;0,00002;FITYURR;UUU;061;0,01;0,01;0,0;0,0;0,01;1;%;N;O;OK;JJJJ
    $
    $ awk -v c=3 'BEGIN {FS=OFS=";"} {$c=substr($c, 3, 2) "/" substr($c, 5, 2) "/" substr($c, 7); print}' fichier
    0560;AAAAAA;17/06/23;BBBBBBBBBBBB;CCCCCCCCCC;FFFFFFFFFF;FFFF;ERTRER;2000;950.0000000;0,0;0,0;0,00002;FITYURR;UUU;061;0,01;0,01;0,0;0,0;0,01;1;%;N;O;OK;JJJJ
    1
    1. diaz1212 Messages postés 6 Statut Membre
       
      Bonjour dubcek,

      je viens de tester la commande elle fonctionne correctement, sauf que le champ 3 peut des fois être vide et dans ce cas il me met les "/", ci-dessous un exemple:


      Fichier:
      0560;AAAAAA;20170623;BBBBBBBBBBBB;CCCCCCCCCC;FFFFFFFFFF;FFFF;ERT
      0561;BBBBBB; ;CCCCCCCCCCCC;LLLLLLLLLL;GGGGGGGGGG;FFFF;VVV


      Commande:
      awk -v c=3 'BEGIN {FS=OFS=";"} {$c=substr($c, 3, 2) "/" substr($c, 5, 2) "/" substr($c, 7); print}' fichier


      resultat:
      0560;AAAAAA;17/06/23;BBBBBBBBBBBB;CCCCCCCCCC;FFFFFFFFFF;FFFF;ERT
      0561;BBBBBB; / / ;CCCCCCCCCCCC;LLLLLLLLLL;GGGGGGGGGG;FFFF;VVV

      Comment je peux enlever les "/" quand le champ est vide ?

      et une dernière question, comment faire pour utiliser cette commande sur 2 champs au même temps (par exmple champ 3 et champ 5 au meme temps dans l'exemple ci-dessous)

      exemple fichier:
      0560;AAAAAA;20170623;BBBBBBBBBBBB;20170625;FFFFFFFFFF;FFFF;ERT
      0561;BBBBBB; ;CCCCCCCCCCCC;20170625;GGGGGGGGGG;FFFF;VVV


      resultat attendu:
      0560;AAAAAA;17/06/23;BBBBBBBBBBBB;17/06/25;FFFFFFFFFF;FFFF;ERT
      0561;BBBBBB; ;CCCCCCCCCCCC;17/06/25;GGGGGGGGGG;FFFF;VVV

      Merci d'avance pour votre aide
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      essayer
      $ awk -v c="3;5" 'BEGIN {FS=OFS=";"; split(c, a)} {for(n in a)if($a[n] ~ /[0-9]/)$a[n]=substr($a[n], 3, 2) "/" substr($a[n], 5, 2) "/" substr($a[n], 7); print}' fichier
      0560;AAAAAA;17/06/23;BBBBBBBBBBBB;17/06/25;FFFFFFFFFF;FFFF;ERT
      0561;BBBBBB; ;CCCCCCCCCCCC;17/06/25;GGGGGGGGGG;FFFF;VVV
      0
      1. diaz1212 Messages postés 6 Statut Membre > dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Merci Bcp bubcek, cela répond parfaitement à ce que je veux faire.
        0
  3. AgecanoniX
     
    Bar
    Précisez votre demande :

    Vous souhaitez modifier ainsi le fichier toto.d'oc

    DateToto.d'oc
    Ou bien

    Création du fichier toto.d'oc le 21072017 ?
    en toto.d'oc créé le 31082018

    C'est important car la démarche est differente
    Pour l'un c'est timestamp
    Pour l'autre c'est modifier un par un ou par groupe
    0
  4. Diaz1212
     
    Bonsoir,
    Merci pour votre retour,
    Je souhaite remplacer le contenu du fichier.
    CAD que j'ai déjà un fichier que je souhaite modifier
    Merci et espérant être claire
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Diaz1212
     
    voici le résultat que je veux obtenir:

    17/07/01;4575;58;;test;toto;17/06/04;titi;tata;;000;
    17/07/02;4576;588;d;test2;toto;20170604;titid;tatad;;000;

    Merci d'avance
    0
  7. Diaz1212
     
    Merci pour votre réponse, mais il manque la date au milieu de la première ligne qui n'est pas formatée (20170604), ce champ aussi doit être qu format 17/06/04.
    Si je comprends bien le formatage de votre commande de agit juste sur la première colonne
    Merci pour votre aide
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      j'avais pas fait attention
      $ sed -r 's+([0-9][0-9])([0-9][0-9])([0-9][0-9])+\2/\3/+g' fichier
      17/07/01;4575;58;;test;toto;17/06/04;titi;tata;;000;
      17/07/02;4576;588;d;test2;toto;17/06/54;titid;tatad;;000;
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      plus court
      $ sed -r 's+([0-9]{2})([0-9]{2})([0-9]{2})+\2/\3/+g' fichier
      17/07/01;4575;58;;test;toto;17/06/04;titi;tata;;000;
      17/07/02;4576;588;d;test2;toto;17/06/54;titid;tatad;;000;
      0
    3. diaz1212 Messages postés 6 Statut Membre > dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Bonjour bubcek,
      merci pour ces retours,
      la commande me renvoi l'erreur suivante:

      sed: illegal option -- r
      Usage: sed [-n] [-u] Script [File ...]
      sed [-n] [-u] [-e Script] ... [-f Script_file] ... [File ...]
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > diaz1212 Messages postés 6 Statut Membre
       
      Salut,

      Sur quel système es-tu ? De l'Unix sûrement ;-\

      Essaye :
      sed 's+\([0-9]\{2\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)+\2/\3/+g' fichier
      0
    5. diaz1212 Messages postés 6 Statut Membre > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Bonjour,
      La commande fonctionne, merci bcp

      par contre j'essaie de l'appliquer à la ligne suivante et il me reformate les 0000000 par 00/00/0 alors que moi je veux reformater que les dates

      fichier:
      0560;AAAAAA;20170623;BBBBBBBBBBBB;CCCCCCCCCC;FFFFFFFFFF;FFFF;ERTRER;2000;950.0000000;0,0;0,0;0,00002;FITYURR;UUU;061;0,01;0,01;0,0;0,0;0,01;1;%;N;O;OK;JJJJ

      resultat:
      0560;AAAAAA;17/06/23;BBBBBBBBBBBB;CCCCCCCCCC;FFFFFFFFFF;FFFF;ERTRER;2000;950.00/00/0;0,0;0,0;0,00002;FITYURR;UUU;061;0,01;0,01;0,0;0,0;0,01;1;%;N;O;OK;JJJJ

      Merci d'avance
      0