AWK code explication

Résolu

Bonjour,

Je souhaite extraire des données de événement_ics1 et évènement_ics2 en les rangeant dans deux variables date1 et heure1. 

J'ai essayé :

date1 = gensub(/^(\[:digit:]{8}).*/, "\\1", "", evenement_ics1)
heure1 = gensub(/.*(\d{6})$/, "\\1", "", evenement_ics1)

Sans succès...


Macintosh / Safari 16.1

4 réponses

  1. Modérateur

    Sinon, dans une expression régulière, tu pourrais utiliser T et Z comme séparateurs des 2 chaines recherchées.

    gawk '
     BEGIN {
       ev1="20211031T080000Z";
       date1 = gensub(/(.+)T(.+)Z/, "\\1", "g", ev1);
       time1 = gensub(/(.+)T(.+)Z/, "\\2", "g", ev1);
       print date1, time1;
     }'

    1
    1. Modérateur

      Bonjour,

      Tu as des contraintes sur les commandes à utiliser ? Car pourquoi sur une chaine de longueur fixe s’embêter avec une expression régulière, on peut utiliser un cut

      ev1="20211031T080000Z"
      date1=`echo $ev1|cut -c 1-8`
      

      0
      1. Merci beaucoup. Oui je ne pouvais pas utiliser cut sinon ça serait déjà fait.

        0
        1. Modérateur

          Avec comme base ta syntaxe, on peut avoir

          gawk '
           BEGIN {
             ev1="20211031T080000Z";
             date1 = gensub(/^([0-9]{8}).*/, "\\1", "g", ev1)
             heure1 = gensub(/.*([0-9]{6}).$/, "\\1", "g", ev1)
             print date1, heure1;
          
          }'
          0
      2. Modérateur

        En awk pur :

         awk '
         BEGIN {
           ts = "20211031T080000Z";
           yyyymmdd = substr(ts, 1, 8);
           yyyy = substr(yyyymmdd, 1, 4);
           mm = substr(yyyymmdd, 5, 2); dd = substr(yyyymmdd, 7, 2);
           print yyyymmdd;
           print yyyy;
           print mm;
           print dd;
        }'
        0