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 - afficher un champs et tout ce qui suit


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 22
    Par défaut Awk - afficher un champs et tout ce qui suit
    Bonjour

    Grâce à Awk, je récupère les champs d'un fichier texte séparés par des " (guillemets)

    Le problème, c'est que à la fin de chaque ligne, j'ai un texte très long, très pollué et qui contient également des guillemets

    J'aimerais pouvoir dire à awk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F' " ' '{print $2, $4, $6, $8->jusqu'à la fin de la ligne}'
    j'aimerais donc ici afficher les champs 2, 4, 6 et 8 plus tout ce qui suit le champs 8 jusqu'à la fin de la ligne

    cela revient à dire afficher tout ce qui suit le champs $7 dans mon exemple

    J'ai cherché un peu, mais dur de trouver la syntaxe qui me permet de facilement réaliser ça

    Qqun a une idée ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 11
    Par défaut
    Bonjour,

    Concatène ta commande avec un cut, c'est "moche" mais ça fonctionne


  3. #3
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Pour faire ça uniquement avec awk, tu n'échapperas pas à glisser/ajouter une boucle du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (i=8;i<=NF;i++) print $i
    NF représentant le nombre de champs de la ligne courante

    A toi d'affiner l'affichage (passage à la ligne ou pas, espace entre les champs, etc...) Par contre, n'oublie que les guillements dans ton "texte très long, très pollué et qui contient également des guillemets" ne seront pas affichés (enfin les ' " '), car toujours considérés comme des séparateurs (de champs).

    Si tu veux les conserver, là aussi c'est à l'affichage que tu dois le gérer.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 22
    Par défaut
    NF, c'est EXACTEMENT ce qu'il me fallait !

    j'étais arrivé à la même conclusion que toi pour tout dire, mais je n'arrivais pas à mettre la main sur la variable "nombre de champs de la ligne en cours"

    Merci à tous les deux pour vos réponses !

  5. #5
    DIE
    DIE est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 101
    Par défaut
    Bonjour à tous,
    Désolé de déterrer ce sujet qui répond bien à la même question que je me posais,
    j'ai juste un problème, je mets un printf afin que tous les champs se suivent pour former
    une seule ligne, mais je n'arrive pas à faire un retour chariot après le dernier champs pour
    que ma ligne suivante (la recherche par /upr/ ) commence sur une nouvelle ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    awk '
    /ITEMS/ {SES=$NF ; print $NF > "/tmp/"SES}
    /label/ {for (i=4;i<=NF;i++) {printf $i" " >> "/tmp/"SES}}
    /upr/   {print $NF >> "/tmp/"SES}
    '
    Merci de votre aide

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 361
    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 361
    Par défaut
    Bonjour, tu peux mettre plusieurs commandes dans chacun de tes blocs awk, donc tu as le droit de faire quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    awk '
    /ITEMS/ {SES=$NF ; print $NF > "/tmp/"SES}
    /label/ {for (i=4;i<=NF;i++) {printf $i" " >> "/tmp/"SES}; printf "\n" >> "/tmp/"SES }
    /upr/   {print $NF >> "/tmp/"SES}
    '

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

Discussions similaires

  1. Awk: afficher le champ x dans un fichier CSV.
    Par vandman dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 07/11/2014, 00h44
  2. Réponses: 10
    Dernier message: 18/06/2009, 13h27
  3. champ auto d'interbase qui ne s'affiche pas
    Par ally dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/04/2007, 20h03
  4. affiche le champ qui apparait le plus
    Par junty dans le forum Access
    Réponses: 4
    Dernier message: 15/12/2006, 13h09
  5. Ne pas afficher un champs qui est vide dans ma BD
    Par yoda_style dans le forum ASP
    Réponses: 3
    Dernier message: 27/04/2004, 11h40

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