Décrypter commande awk

Fermé
Scoob16 - Modifié le 6 mai 2022 à 17:12
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 6 mai 2022 à 17:36
Bonjour,

Je n'arrive pas à comprendre clairement ce que fait ce bout de script. Est-ce que quelqu'un pourrait m'aider svp ?

BEGIN{flag = 0}
{
    if (($0 ~"^0128000MU") && substr($0, 38, 2) == "02" && substr($0, 42, 1) == "1")
    {
        flag = 1;
        print $0
    };
    if (($0 !~"^0128") && flag == "1")
    {
        var = $0;
        while (var ~"14099[ ]*[0-9]*[ ]*[A-Z]")
        {
            var_init = substr(var, match(var, "14099[ ]*[0-9]*[ ]*[A-Z]"), RLENGTH + 18);
            dfin = substr(var_init, 25, 8);
            if (dfin != "00000000" && substr(var_init, 14, 1) == "C")
            {
                var_fin = substr(var_init, 1, 13) "A" substr(var_init, 15, 2) "" dfin "20241231";
                sub(var_init, var_fin, $0)
            };
            var = substr(var, match(var, "14099[ ]*[0-9]*[ ]*[A-Z]") + RLENGTH)
        };
        flag = 0
    };
    if (flag == 0)
    {
        print $0
    }
}
A voir également:

1 réponse

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
6 mai 2022 à 17:36
Bonjour,

Sans le fichier d'entrée que ce script
awk
traite, il n'est pas forcément très simple d'expliquer ce que ça fait, mais en gros ça lit un fichier d'entrée ligne par ligne et ne réécrit que certaines lignes (éventuellement en les modifiant). Les fonctions
awk
sont documentées dans
man awk
. Il peut être intéressant de lire un tutoriel sur les expressions rationnelles.

Voici en gros ce que fait ton script :
  • l3-7 : si la ligne courante du fichier commence par
    0128000MU
    et qu'aux caractères 38-39 il est écrit "02" et que le caractère 42 est "1", alors flag passe à 1 et la ligne est écrite. C'est probablement pour détecter un début de section de texte intéressante pour la suite du script.
  • l8-23 : si la ligne courante du fichier commence par
    0128
    et que
    flag
    vaut "1" alors
    • l11: tant que
      var
      (initialisé à la ligne courante
      $0
      ) contient "14099", suivi de 0 ou plusieurs espaces, suivi d'une suite d'entiers compris entre 0 et 9, suivi de 0 ou plusieurs espaces , suivi d'un caractère majuscule alors on extrait ce bout dans
      var_init
      .
    • l13-17 : l'idée est ici de reconstruire
      var_fin
      à partir de
      var_init
      (en remplaçant l'éventuel "C" au caractère 14 par un "A").
    • l18: on remplace dans la ligne courante les occurrences de
      var_init
      par
      var_fin
      .
    • l20: on passe au bout suivant de chaîne suivant.
    • l22: le
      while
      a pris fin, donc on a extrait tous les bouts et on passe
      flag
      à 0.
  • l24-26 : si
    flag
    vaut 0 on écrit la ligne courante.


Il est d'ailleurs intéressant de souligner que la personne qui a écrit ce script ne devait pas être familière de
awk
, car normalement on ne met pas de ";" derrière les "}", et tout a été écrit dans le bloc BEGIN, ce qui laisse entendre que seule la première ligne du fichier d'entrée est prise en compte. Ensuite toute la boucle 11-20 se réécrit probablement plus simplement avec la fonction
gsub
de
awk
.

Bonne chance
0