Décrypter commande awk

Scoob16 -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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
    }
}

1 réponse

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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