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 :

FS multiple dans awk


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Avril 2015
    Messages : 21
    Par défaut FS multiple dans awk
    Bonjour

    avec awk, je dois lire un fichier dont les séparateurs d'entrée (FS) sont soit des espaces, soit des virgules. J'ai donc défini dans mon code :
    Hélas, comme j'ai aussi des espaces avant le premier champ, quand je tente de lire $1, il me renvoie un résultat nul, le premier champ apparaissant en $2. En effet, "If `FS' is any other single character, such as `","', then each occurrence of that character separates two fields. Two consecutive occurrences delimit an empty field. If the character occurs at the beginning or the end of the line, that too delimits an empty field. The space character is the only single character which does not follow these rules."
    (https://docs.freebsd.org/info/gawk/g...eparators.html)
    Plus bas dans le doc, on lit bien qu'avec le FS par défaut (càd space) les premiers espaces ne sont pas lus, mais dès qu'on indique en dur FS = " ", il prend le(s) premier(s) espace(s) comme le champ $1 : " There is an important difference between the two cases of `FS = " "' (a single blank) and `FS = "[ \t]+"' ... "

    Comme j'ai des fichiers qui peuvent avoir des espaces en premières colonnes ou pas (càd commençant avec de suite une valeur qui est donc en $1), je ne peux extraire le premier champ en $2 forcément. Je suis bien embêté.
    Qqn saurait-il comment rédiger ce FS, et si possible pas en script (càd -F"....") mais dans un BEGIN
    Merci !

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

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

    Si la source est sale, ne peux-tu pas demander à ton fournisseur un fichier propre ? Ne peux-tu pas nettoyer le fichier avant de le traiter ?

    Cela me semble être du bricolage mais tu peux faire une accolade (un code pour chaque ligne) qui rameutent les champs vers le champ 1.

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    même conseil, le mieux est encore de travailler directement sur un fichier propre, si jamais c'est pas une option une méthode un peu cradingue mais qui peut aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'[ ,]+' '{gsub(/^[ ,]+/,"",$0)} {print $1}'
    en clair pour chaque ligne (pas seulement dans la clause BEGIN donc) on zappe explicitement les séparateurs du début et on met à jour $0, et par là le découpage des variables positionnelles qui suivent

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Avril 2015
    Messages : 21
    Par défaut
    Merci à vous. En effet, j'étais à 2 doigts de faire un {for (all$) substr($i,1,length($i)-1) dans chaque ligne pour enlever la virgule collée en fin de chaque champ

    En fait j'avais oublié qu'un code awk peut s'écrire avec plusieurs {parties} qui s'exécutent l'une après l'autre, dont le gsub que je n'ai vraiment jamais utilisé.
    Je viens de gagner +3 XP en awk, ça progresse ...

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

Discussions similaires

  1. Sélection multiple dans un sous formulaire ?
    Par _developpeur_ dans le forum Access
    Réponses: 2
    Dernier message: 09/03/2019, 01h05
  2. Commange Grep dans Awk
    Par lili_bzh dans le forum Linux
    Réponses: 1
    Dernier message: 10/01/2006, 11h49
  3. [Débutant] Sélection multiples dans une Listbox
    Par eraim dans le forum Access
    Réponses: 4
    Dernier message: 15/10/2005, 03h21
  4. Enregistre résulat multiplication dans une table
    Par faranfasi dans le forum Access
    Réponses: 2
    Dernier message: 11/10/2005, 13h04
  5. Problème d'ajout multiples dans un BDD Access
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/05/2004, 13h34

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