IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Comment dans gawk créer un fichier .log avec une redirection ?


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 164
    Par défaut Comment dans gawk créer un fichier .log avec une redirection ?
    Bonjour,

    Dans un script, j'utilise gawk selon ce schéma :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    gawk -N -F ';' -v var1=1.0  '
    {
        if CONDITION 
    	  {
    		printf("%12s", $1) 
    		printf(";")
    		printf("%8s", $3)
    		printf(";")
     
    		#etc . . .
     
    		printf ("\n")
    	}
    } ' ftmp8a1.csv > ftmp8a2.csv
    Ce schéma marche bien.

    Quand la condition "CONDITION" n'est pas vérifiée, je souhaiterais créer, en plus, un fichier d'anomalie en .log reprenant certains champs.
    Je n'y arrive pas !
    J'ai complété le code précédent, mais je n'arrive pas à obtenir un code correct.
    Code modifié avec "else" incorrect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    echo "TitreCol1;TitreCol2;TitreCol3;TitreCol4;TitreCol5" > f8a.csv
    gawk -N -F ';' -v var1=1.0  '
    {
        if CONDITION 
    	  {
    		printf("%12s", $1) 
    		printf(";")
    		printf("%8s", $3)
    		printf(";")
     
    		#etc . . .
     
    		printf ("\n")
    		}
        else
            {
                 echo "$10;$2;$5;$9;var1" >> f8a.log
    	}
     
    } ' ftmp8a1.csv > ftmp8a2.csv
    La redirection dans le "else" ne fonctionne pas.
    Peut-on faire autrement ? ou Qu'est-ce qui cloche ?

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Liamm Voir le message
    La redirection dans le "else" ne fonctionne pas.
    Bah oui, le langage "awk" est un langage "à part", utilisé par, pour et dans awk. Il n'a aucun rapport avec le shell et les syntaxes "shell" ne sont pas applicables. D'ailleurs tu ne t'étonnes pas d'utiliser "$3" dans awk sans te dire qu'en shell "$3" n'a pas la même signification.
    C'est comme si tu essayais de mettre des redirections ">" en C ou en Python...

    Citation Envoyé par Liamm Voir le message
    Peut-on faire autrement ?
    Passer par des fonctions IO internes awk => https://www.gnu.org/software/gawk/ma...Functions.html
    Dans le "else" tu ouvres un fichier et tu écris dedans.

    Ou alors tu crées deux awk, le premier qui traite le fichier avec la condition vérifiée et le second dédié à traiter les anomalies quand la condition n'est pas vérifiée.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    ce n'est pas la redirection qui ne fonctionne pas, c'est le echo ! ce n'est pas une commande awk.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ gawk 'BEGIN{
        print "foo" >>"/tmp/awk.log"
        print "bar" >>"/tmp/awk.log"
    }'
    $ cat /tmp/awk.log
    foo
    bar
    $
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 164
    Par défaut
    Merci,
    Pour conclure, voici le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    printf "TitreCol1;0TitreCol2;TitreCol3;TitreCol4;TitreCol5" > f8a.log
    printf "\n" >> f8a.log
     
    gawk -N -F ';' -v var1=1.0  '
    {
        if CONDITION 
    	  {
    		printf("%12s", $1) 
    		printf(";")
    		printf("%8s", $3)
    		printf(";")
     
    		#etc . . .
     
    		printf ("\n")
    		}
            else
                {
                printf $3        >> "f8a.log"   
                printf(";")      >> "f8a.log" 
                printf $2        >> "f8a.log"   
                printf(";")      >> "f8a.log" 
                printf $5        >> "f8a.log"   
                printf(";")      >> "f8a.log" 
                printf $9        >> "f8a.log"  
                printf(";")      >> "f8a.log" 
                printf var1      >> "f8a.log"  
    	    printf("\n")     >> "f8a.log"          
                }
     
    } ' ftmp8a1.csv > ftmp8a2.csv
     
     
    sort f8a.log -t";" -k2  > ftmp8a5.csv
    #
    #Édition des anomalies
    #
    pr -d -h "$0 . . . Anomalies \
    triées par valeurs croissantes\
     . . . . " -l 45 -e";"13 -c ftmp8a5.csv
    . . . que j'ai pu établir grâce à vos conseils.

    À noter:
    1- comme je trie le fichier .log en colonne 2 avec sa ligne de titre, j'ai dû rajouter 0 devant TitreCol2
    2- concernant ce point, peut-on trier un fichier qu'à partir de la ligne 2, pour ne pas trier les titres des colonnes se trouvant en ligne 1 ?
    3- dans la ligne de titre j'avais mis le caractère pourcentage % que j'ai dû retirer, car ça créait une erreur.
    4- Je n'ai pas réussi le codage en mettant des "print".

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    1- `comprends pas
    2- pas directement, il faut afficher la première ligne (head), puis trier le reste (tail)
    3- pas de message d'erreur, pas de solution envisageable
    4- idem
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 362
    Par défaut
    Point 1 et 2, puisque tu utilises gawk, pourquoi tu ne tries pas avec lui ?

    PROCINFO["sorted_in"]
    If this element exists in PROCINFO, then its value controls the order in which array elements are traversed in for loops. Supported values are "@ind_str_asc", "@ind_num_asc", "@val_type_asc",
    "@val_str_asc", "@val_num_asc", "@ind_str_desc", "@ind_num_desc", "@val_type_desc", "@val_str_desc", "@val_num_desc", and "@unsorted".

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    1- `comprends pas
    Pour que la ligne de titre soit toujours en premier même après le tri. Il trie sur colonne 2 donc il fait en sorte que le titre de la colonne 2 commence par 0.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 164
    Par défaut
    @N_BaH
    1- `comprends pas
    2- pas directement, il faut afficher la première ligne (head), puis trier le reste (tail)
    Au lieu de faire tout cela : (ce qui correspond à ton point 2/2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    VAR1=$(grep '^TitreCol1;' -n f8a.log)
    VAR2=${VAR1:0:2}
    VAR3=$(($VAR2 + 1))
     
    head -n $VAR2  f8a.log > ftmp1.csv
    tail +$VAR3    f8a.log > ftmp2.csv
    sort ftmp2.csv -t";" -k2 > ftmp3.csv
    je trie toutes les lignes du fichier, ligne titre comprise.
    Mais comme l'on veut que la ligne titre, une fois le fichier trié, apparaisse toujours en première ligne, je change le libellé titre de la colonne triée.
    Ainsi, pour ce faire, je change le libellé "TitreCol2" en "0TitreCol2"


    @disedorgue
    Point 1 et 2, puisque tu utilises gawk, pourquoi tu ne tries pas avec lui ?
    C'est une bonne idée.
    J'ai trouvé la documentation correspondante sur :
    https://www.gnu.org/software/gawk/ma...-Scanning.html
    Mais actuellement je ne sais pas faire.
    Il faudra que je regarde cela de plus près !


    @Sve@r
    C'est cela, tu as tout compris.

    Merci à tous.

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    tu utilises trop de fichiers temporaires; apprend à utiliser des pipes !

    et oublie la réécriture de lignes du fichier pour conserver la première ligne, fais un head...; tail...| sort.... KISS!
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 164
    Par défaut
    @N_BaH

    =>
    Merci, oui, c'est bien la "formule" que je retiendrai de ce post.
    C'est-à-dire le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    head...; tail...| sort...
    Mais cela reste peu pratique pour des mises à jour de table, où il faut :
    1- séparer le titre qui est éventuellement sur plusieurs lignes
    2- séparer les données pour :
    . . . 2a- les trier
    . . . 2b- les traiter par d'autres commandes : join, ...
    3- rassembler Titre et données traitées pour constituer le fichier table mis à jour.



    =>
    Tu utilises trop de fichiers temporaires ; apprend à utiliser des pipes !
    Effectivement, j'en ai 464 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    find -iname "ftmp*" | wc -l
    464
    Pourquoi tant de fichiers temporaires ?
    C'est parce que je lance régulièrement les mêmes shells.
    J'aime avoir une trace des traitements, ce qui me permet en cas de résultat erroné de localiser plus rapidement le code source concerné.
    D'un traitement à l'autre, les fichiers temporaires s'écrasent à nouveau, et donc le volume pris sur le disque ne varie pas.

    Par contre, j'ai trop de fichiers de sauvegarde.
    Chaque fois que je fais une modification dans un fichier table, je sauvegarde la table d'avant, au cas où une erreur surviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    find -iname "*save*" | wc -l
    517
    517, c'est beaucoup trop !
    Actuellement, je fais une vérification poussée en fin d'année et je supprime si tout va bien, toutes les sauvegardes de l'année civile.
    Il faudra que je trouve une autre méthode pour ces fichiers sauvegardés dont le nombre, lui, augmente traitement après traitement.

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Mais cela reste peu pratique pour des mises à jour de table
    ce sera toujours moindre cradot que de triturer les données d'origines.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 362
    Par défaut
    On n'a pas besoin de head et tail pour trier avec sort en conservant la première ligne comme titre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ cat /tmp/fic_a_trier 
    c1;c2;c3
    foo4;bar01;foobar4
    foo7;bar04;foobar1
    foo5;bar02;foobar3
    foo12;bar09;foobar-4
    foo9;bar06;foobar-1
    foo3;bar00;foobar5
    foo13;bar10;foobar-5
    foo6;bar03;foobar2
    foo10;bar07;foobar-2
    foo8;bar05;foobar0
    foo11;bar08;foobar-3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ exec 3</tmp/fic_a_trier 
    $ read lne1 <&3
    $ echo "$lne1" ; sort -t";" -k2 <&3 
    c1;c2;c3
    foo3;bar00;foobar5
    foo4;bar01;foobar4
    foo5;bar02;foobar3
    foo6;bar03;foobar2
    foo7;bar04;foobar1
    foo8;bar05;foobar0
    foo9;bar06;foobar-1
    foo10;bar07;foobar-2
    foo11;bar08;foobar-3
    foo12;bar09;foobar-4
    foo13;bar10;foobar-5

  13. #13
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    en bash : read -u3 lne1
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    Même en awk, la structure ne me fait pas rêver. Je préfèrerais un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (FNR==1){print; next;}
     
    CONDITION{
        print blablabla
        next;
    }
     
    { 
        print "erreur" >> "traces.log";
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] Créer un fichier batch avec une arborescence.
    Par Khamazah dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 22/12/2022, 16h22
  2. Réponses: 1
    Dernier message: 16/04/2019, 20h01
  3. comment créer un fichier log dans PHP
    Par AliciaSH dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 14
    Dernier message: 19/05/2017, 11h59
  4. Créer un fichier mp3 avec une macro vba
    Par xavion dans le forum Excel
    Réponses: 10
    Dernier message: 14/11/2012, 20h01
  5. Réponses: 3
    Dernier message: 24/04/2007, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo