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 :

Afficher un intervalle de champs avec awk


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Par défaut Afficher un intervalle de champs avec awk
    Bonjour,

    j'ai ce texte à parser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    d0: Mirror     Submirror 0: d10       State: Okay              Submirror 1: d20       State: Okay              Pass: 1     Read option: roundrobin (default)     Write option: parallel (default)     Size: 4194828 blocks
    d10: Submirror of d0     State: Okay              Size: 4194828 blocks     Stripe 0: Device              Start Block  Dbase State        Hot Spare c0t0d0s0                   0     No    Okay
    d20: Submirror of d0     State: Okay              Size: 4194828 blocks     Stripe 0: Device              Start Block  Dbase State        Hot Spare c0t1d0s0                   0     No    Okay
    etc...

    Je passe ça comme commande :

    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
    nawk 'BEGIN {RS=""}
    {gsub(/\n/," ",$0)
    gsub(/\t/,"", $0)
    print $1"|"$2"|"$3"|"$4"|"$5}' meta.txt
     
     
    d0:|Mirror|Submirror|0:|d10
    d10:|Submirror|of|d0|State:
    d20:|Submirror|of|d0|State:
    d1:|Mirror|Submirror|0:|d11
    d11:|Submirror|of|d1|State:
    d21:|Submirror|of|d1|State:
    d4:|Mirror|Submirror|0:|d14
    d14:|Submirror|of|d4|State:
    d24:|Submirror|of|d4|State:
    d5:|Mirror|Submirror|0:|d15
    d15:|Submirror|of|d5|State:
    d25:|Submirror|of|d5|State:
    d6:|Mirror|Submirror|0:|d16
    d16:|Submirror|of|d6|State:
    d26:|Submirror|of|d6|State:
    d7:|Mirror|Submirror|0:|d17
    d17:|Submirror|of|d7|State:
    d27:|Submirror|of|d7|State:
    Cela me donne bien ce que je veux, mais le soucis c'est qu'il ya beaucoup de champs ($1,$2,$3,$4,$5,$6 etc..), et que je ne veux pas alourdir la commande en les mettant tous, c'est pourquoi j'aimerais savoir si il existait un moyen (sans doute une boucle) pour afficher tout les champs sans devoir les rentrer dans la commande ?

    Merci d'avance.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nawk 'BEGIN{RS=""}
    {
       gsub(/\n/," ",$0)
       gsub(/\t/,"", $0)
       for( x=1; x<=NF; x++) if(x < NF){ printf("%s|",$x) }else{ printf("%s\n",$x) }
    }'

    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sedawk Voir le message
    ...mais le soucis c'est qu'il ya beaucoup de champs ($1,$2,$3,$4,$5,$6 etc..), et que je ne veux pas alourdir la commande en les mettant tous, c'est pourquoi j'aimerais savoir si il existait un moyen (sans doute une boucle) pour afficher tout les champs sans devoir les rentrer dans la commande ?
    Salut

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    nawk 'BEGIN {RS=""} {gsub(/\n/," ",$0); gsub(/\t/,"", $0); for (i=1; i <= NF; i++) printf("%s%s", $i, i < NF ?"|" :"\n" )}' meta.txt
    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]

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed ':z;N;$!bz;s/ \|\n/|/g;s/\t/|/g;s/||*/|/g' fichier


    Oups, rectification

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed ':z;N;$!bz;s/\s\+\|\n/|/g' fichier

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tr -d '\n' < fichier | tr -s ' ' '|'
    Le fait aussi

    Édit : Décidément ce n'est pas mon jour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tr -s '[ \n]' '||' < fichier
    Est encore plus simple

  6. #6
    Membre confirmé
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Par défaut
    Bonsoir,

    merci à tous pour vos réponses, c'est sympas de voir les différentes façons de faire

    Les solution de N_BaH et sve@r m'ont paru moins complexe à comprendre que le sed ce qui n'enlève pas le mérite de cette commande aussi utile que awk

    A priori c'est tout à fait ce que je voulais, juste une petite question à sve@r, tu peux m'expliquer cette partie du code avec le point d'interrogation ? merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s%s", $i, i < NF ?"|" :"\n" )}

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sedawk Voir le message
    A priori c'est tout à fait ce que je voulais, juste une petite question à sve@r, tu peux m'expliquer cette partie du code avec le point d'interrogation ? merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s%s", $i, i < NF ?"|" :"\n" )}
    Il s'agit d'une écriture empruntée au langage C (théoriquement awk devrait accepter).

    La syntaxe générale est condition ?valeur_si_vrai :valeur_si_fauxIl s'agit d'un opérateur donc d'une instruction complète qui vaut la valeur 1 si la condition est vérifiée et sinon la valeur 2.

    Donc ici, "%s" reçoit et affiche
    => "|" si i < NF donc si on est en milieu de ligne
    => "\n" si i == NF donc si on est sur le dernier mot de la ligne
    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
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Explications concernant la commande "sed" :

    :z
    On pose une étiquette (2 points suivis du nom que tu veux) afin de boucler sur celle-ci en fonction d'une condition (voir plus loin)


    N
    On ajoute la ligne suivante dans la mémoire principale


    $! bz
    La condition et le comportement à adopter en fonction.
    Donc, si ce n'est pas la dernière ligne ("$" caractérisant la dernière ligne et "!" la négation) qui est chargée dans la mémoire principale, on se branche (b) à l'étiquette ":z"


    s/\s\+\|\n/|/g
    On subsitue n'importe quel caractère d'espacement (le "\s" signifiant espace, tabulation horizontale ou verticale) présent une ou plusieurs fois (\+), ou (\|) un caractère de saut de ligne (\n) par une barre verticale (|) et ceci autant de fois que nécessaire (g)

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    Explications concernant la commande "sed" :


    Impressionnant
    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]

  10. #10
    Membre confirmé
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Par défaut
    Merci à vous trois !

    Pour le sed, j'avoue faut maitriser mais chapeau bas, pour awk, je ne cesse d'apprendre de nouvelles choses chaque jour

    J'ai trouver comment passer en résolu

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

Discussions similaires

  1. Parcourir et comparer des champs avec awk ?
    Par Gothan44 dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 21/10/2013, 16h12
  2. parcourir 2 fichiers avec awk, et comparer 2 champs
    Par morphdown dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 09/07/2013, 11h03
  3. Réponses: 3
    Dernier message: 13/07/2012, 10h58
  4. [AC-2007] afficher des champs avec case a cocher
    Par bernards111 dans le forum IHM
    Réponses: 6
    Dernier message: 21/12/2010, 22h34
  5. Tronquer un champ avec awk
    Par ben_harper dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 22/01/2008, 10h22

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