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

Résolu
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. Contributeur
    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
    1. Contributeur
      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. 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. Contributeur
        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
      3. @dubcekMerci Bcp bubcek, cela répond parfaitement à ce que je veux faire.
        0
    2. 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
      1. 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
        1. 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
          1. 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. Contributeur
              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. Contributeur
              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. @dubcekBonjour 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. Contributeur
              @diaz1212Salut,

              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. @zipe31Bonjour,
              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