• # Éviter de faire des traitements en shell

    Posté par (site web personnel) . En réponse au message concaténer et dé-dupliquer fichiers. Évalué à 3.

    Mon point de vue est que le shell est très bien pour combiner des traitements ensemble mais qu'il est plutôt à éviter pour implémenter ces traitements eux-mêmes. Les raisons sont que le langage rend la description de ces traitements difficile – même si certains dialectes comme bash ou zsh améliorent un peu la situation. Voici donc une procédure awk qui fait le travail, mais beaucoup d'autres langages peuvent être utilisés à sa place:

    BEGIN {
     FS=" #"
    }
    {
     if($1 in seen) {
     origin[$1] = origin[$1] "," $2
     } else {
     origin[$1] = $2
     }
     seen[$1]
    }
    END {
     for(result in seen){
     printf("%s #%s\n", result, origin[result]);
     }
    }

    Le cœur du programme est la partie

    {
     if($1 in seen) {
     origin[$1] = origin[$1] "," $2
     } else {
     origin[$1] = $2
     }
     seen[$1]
    }

    qui est appliquée sur toutes les lignes de l'entrée. Les variables 1ドル et 2ドル renvoient à la première et deuxième colonne de la ligne en cours de traitement, la déclaration BEGIN { FS=" #" } dit justement comment ces colonnes sont délimitées. La phrase seen[1ドル] est peut être un peu bizarre, elle correspond à l'ajout d'une clef sans valeur dans un tableau associatif.

    Lorsque toutes les lignes ont été traitées, awk* passe au bloc END dont le contenu est lui aussi explicite.