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 :

[awk] Traitement ligne selon la casse


Sujet :

Shell et commandes GNU

  1. #1
    Membre actif
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Points : 292
    Points
    292
    Par défaut [awk] Traitement ligne selon la casse
    Bonjour, j'ai écris cette ligne de code en awk et j'aimerais avoir confirmation sur son résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NR == 3 {FS=" "; if( $2 ~ /^[A-Z]/ ) {error=$2}; next;}
    Traitement de l’enregistrement numéro trois du fichier entrant, sur cet enregistrement j'applique un séparateur de champs qui équivaut a <espace> si le champ numéro deux de cet enregistrement commence par une majuscule alors j'enregistre ce champ dans la variable error et saut a l'enregistrement suivant.

    Etes-vous d'accord avec ca ?

    J'ai un doute sur la condition commence par une majuscule.

    Merci pour votre aide.

    NB: Comment ajouter au sujet la mention [awk]
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    tu peux te simplifier la vie en matchant directement sur les deux conditions

    l'option -F' ' peut remplacer ton FS=" ", note également que par défaut FS vaut un truc du style [ \t]+ donc à moins d'avoir explicitement besoin de ne pas prendre en compte les espaces multiples et/ou les tabulations inutile de le modifier à nouveau dans le script

    inutile également de préciser next s'il n'y a aucune autre instruction derrière, awk passera automatiquement à la ligne suivante, en revanche vu qu'il n'y a qu'une seule et unique ligne 3, au lieu de next on pourrait vouloir mettre fin au traitement directement avec exit 0 (tout s'est bien passé) sinon dans un autre bloc (qui ne peut être exécuté QUE si la condition précédente n'a pas été exécuté) on sort avec exit 1 (on a pas trouvé la ligne), ça n'est qu'une suggestion mais ça peut éventuellement être utile

    enfin error=$2 est valide, mais on ne sait pas ce que tu fais de la variable ensuite, si c'est pour récupérer dans le shell ça ne marchera pas comme ça.

    au final perso je ferai un truc dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    machin=$(awk -F' ' 'NR == 3 && $2 ~ /^[A-Z]/ {print $2; exit 0} {exit 1}' fichier)
    if [ $? = 0 ] then
       echo "trouvé : $machin"
    else
       echo "non trouvé"
    fi
    mais j'anticipe peut-être à tort ton besoin... :p

  3. #3
    Membre actif
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Points : 292
    Points
    292
    Par défaut
    Bonjour et merci pour le retour,

    ci-joint le code complet, il y doit y avoir pas mal d'anomalie , cependant il est fonctionnel j'ai encore quelques bug qui subsite, je ne l'ai pas mis dès le début pour ne pas partir dans tout les sens.

    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
    41
    42
    43
    44
    #!/bin/bash
     
    rm -rf *.del
     
    awk 'BEGIN{search="."}; NR == 1 {title = FILENAME;split(title,array,search); print "01: "array[1]  >> array[1]".drc.results.txt"}; /^Rule File Pathname:/ {c++} {print >> array[1]"-" c "-db.del";}' $1	
    for dbfile in *-db.del; do
    	awk ' BEGIN{search="-"};
    		  NR == 1 {title = FILENAME;split(title,array,search)};
    		  NR == 3 {FS=" "; error=$2; next;}
    		  NR == 4 {if( $0 ~ /^p / || $0 ~ /^e / ){{d+=1}; getline;}}
    		  {if ( d!=0 && ($0 ~ /^p / || $0 ~ /^e /) ) {d++}};  
    		  END {if(d!=0){ {concat= error"\t\t("d")"}; {print concat >> array[1]".drc.results.txt" }}}' $dbfile		  
    done
     
    rm -rf *-db.del
     
    awk 'BEGIN{search="."}; NR == 1 {title = FILENAME;split(title,array,search); print "02: "array[1]  >> array[1]".drc.results.txt"}; /^Rule File Pathname:/ {c++} {print >> array[1]"-" c ".del";}' $2
    for file in *.del; do
    	awk ' BEGIN{search="-"};
    		  NR == 1 {title = FILENAME;split(title,array,search)};
    		  NR == 3 {FS=" "; error=$2; next;}
    		  NR == 4 {if( $0 ~ /^p / || $0 ~ /^e / ){{d+=1}; getline;}}
    		  {if ( d!=0 && ($0 ~ /^p / || $0 ~ /^e /) ) {d++}};   
    		  END {if(d!=0){ {concat= error"\t\t("d")"}; {print concat >> array[1]".drc.results.txt" }}}' $file	  
    done	
     
    rm -rf *.del
     
    sort -o $1".txt" $1".txt"
    sort -o $2".txt" $2".txt"
     
    awk ' NR == 1 {title = FILENAME; getline}; {print >> "modified_"title}' $1".txt"
    awk ' NR == 1 {title = FILENAME; getline}; {print >> "modified_"title}' $2".txt"
     
    diff -y "modified_"$1".txt" "modified_"$2".txt" > /dev/null
     
    if [[ $? -eq 1 ]]
    then
     
    diff -y $1".txt" $2".txt" > $1"_vs_"$2.txt
     
    fi
     
    rm -rf modified_$1.txt modified_$2.txt $1.txt $2.txt
    soyez indulgent

    Ok ==> l'option -F' ' peut remplacer ton FS=" ".
    OK ==> inutile également de préciser next s'il n'y a aucune autre instruction derrière.

    Par contre je ne comprend pas si je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     NR == 3 {FS=" "; error=$2; next;}
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NR == 3 {FS=" "; if( $2 ~ /^[A-Z]/ ) {error=$2}; next;}
    parfois error vaut "width" en minuscule alors que je ne souhaite enregistrer que les mots en majuscule, je n'ai pas saisie le pb.

    Merci pour votre aide
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bonjour,
    Citation Envoyé par julien terrier Voir le message
    Par contre je ne comprend pas si je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     NR == 3 {FS=" "; error=$2; next;}
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NR == 3 {FS=" "; if( $2 ~ /^[A-Z]/ ) {error=$2}; next;}
    parfois error vaut "width" en minuscule alors que je ne souhaite enregistrer que les mots en majuscule, je n'ai pas saisie le pb.
    Remplace ton /^[A-Z]/ par /^[[:upper:]]/, car parfois selon la version de locale utilisé le [A-Z] n'est pas sensible à la casse...
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    parfois error vaut "width" en minuscule
    pense à nous donner un échantillon représentatif et correspondant du fichier à traiter.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre actif
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Points : 292
    Points
    292
    Par défaut
    Bonjour,

    @disedorgue, je n'ai pas encore eu l'occasion d'essayer /^[[:upper:]]/ sur ce script car j'ai modifié une grande partie de mon script en modifiant l'approche de l'analyse syntaxique du fichier log d'entrée, mais je garde en tete cette methode et j'essayerais asap merci.

    @N_Bah, tu as raison c'est bien plus simple si il y a toutes les composantes.

    Script nouvelle revision:

    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
    #!/bin/bash
     
    rm -rf *.del
     
    awk 'BEGIN{search="."}; NR == 1 {title = FILENAME; split(title,array,search); print "01: "array[1]  >> array[1]".drc.results.txt"}; {if ( NF == 1 ) {c++} {print >> array[1]"-" c "-db.del"}}' $1	
    for dbfile in *-db.del; do
    	awk ' BEGIN{search="-"};
    		  NR == 1 {title = FILENAME;split(title,array,search); error=$1};
    		  NR == 2 {if( $1 ~ /^([1-9])/) {count=$1}};   
    		  END {if(count!=0){ {concat= error"\t\t("count")"}; {print concat >> array[1]".drc.results.txt" }}}' $dbfile		  
    done
     
    rm -rf *-db.del
     
    awk 'BEGIN{search="."}; NR == 1 {title = FILENAME;split(title,array,search); print "02: "array[1]  >> array[1]".drc.results.txt"}; {if ( NF == 1 ) {c++} {print >> array[1]"-" c ".del"}}' $2
    for file in *.del; do
    	awk ' BEGIN{search="-"};
    		  NR == 1 {title = FILENAME;split(title,array,search); error=$1};
    		  NR == 2 {if( $1 ~ /^([1-9])/) {count=$1}}; 
    		  END {if(count!=0){ {concat= error"\t\t("count")"}; {print concat >> array[1]".drc.results.txt" }}}' $file	  
    done	
     
    rm -rf *.del
     
    sort -o $1".txt" $1".txt"
    sort -o $2".txt" $2".txt"
     
    awk ' NR == 1 {title = FILENAME; getline}; {print >> "modified_"title}' $1".txt"
    awk ' NR == 1 {title = FILENAME; getline}; {print >> "modified_"title}' $2".txt"
     
    diff -y "modified_"$1".txt" "modified_"$2".txt" > /dev/null
     
    if [[ $? -eq 1 ]]
    then
     
    diff -y $1".txt" $2".txt" > $1".txt_vs_"$2".txt"
     
    fi
     
    rm -rf modified_$1.txt modified_$2.txt $1.txt $2.txt
    Merci pour votre aide, je cloture.
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

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

Discussions similaires

  1. [awk] Traitement par ligne je bl_AWK
    Par julien terrier dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 25/07/2017, 09h31
  2. [2012] Traitement différent selon les lignes
    Par FlashBz dans le forum Développement
    Réponses: 1
    Dernier message: 14/12/2016, 19h03
  3. Traitement ligne par ligne sans curseur
    Par AbyssoS dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/02/2006, 17h46
  4. Ne pas afficher une ligne selon une valeur
    Par uloaccess dans le forum Access
    Réponses: 3
    Dernier message: 18/11/2005, 14h04
  5. Ajout n lignes selon valeur...
    Par nicburger dans le forum Access
    Réponses: 1
    Dernier message: 26/10/2005, 19h49

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