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 POSIX Discussion :

Lecture d'une variable avec IFS=, et read


Sujet :

Shell et commandes POSIX

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut Lecture d'une variable avec IFS=, et read
    Bonjour,
    J'ai une variable contenant plusieurs sous-variables séparées par ','
    Je cherche a faire un traitement sur chaque sous-variable.
    J'y arrive avec tr que je voudrais supprimer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    La_var='aaa,bbb,ccc' ;  echo "$La_var" | tr , '\n' | while read line ; do echo "$line" ; done
    aaa
    bbb
    ccc
    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    La_var='aaa,bbb,ccc' ;  echo "$La_var" | while IFS=, read line ; do echo "$line" ; done
    aaa,bbb,ccc
    Là, il y a quelquechose qui m'echappe.
    Merci de votre aide.
    Cordialement.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Là, il y a quelquechose qui m'echappe.
    Le "F" de "IFS" veut dire "Field", soit "champ".
    Tu confonds le séparateur d'enregistrements avec le séparateur de champs.
    Dans awk, RS avec FS.
    Dans bash, par défaut, \n est le séparateur de lignes (donc d'enregistrements) et l'espace, le séparateur de champs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ La_var='aaa,bbb,ccc' ;  echo "$La_var" | while IFS=, read a b line reste; do echo "$line" ; done
    ccc
    Quand on ne donne qu'une variable à read, il met toute la ligne.
    Mais si on donne plus d'une, il remplit successivement et met le reste dans la dernière.
    Voilà pourquoi, même si je suis sûr qu'il n'y aura que 3 variables, je rajoute une variable "reste" ... au cas où.

    Sinon, tu peux utiliser l'option "-a" de read qui sert à remplir un tableau

    À toi de voir.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    Merci pour l'explication.
    Ma variable est dynamique donc je ne connais pas le nombre de champs.
    L'option -a n'est pas disponible.
    Je vais donc conserver mon tr
    Cordialement.

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    L'option -a n'est pas disponible.
    Et mapfile ?
    C'est pareil.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LeOpenBSD$ man mapfile
    man: No entry for mapfile in the manuel.
    Le but initial était de supprimer tr qui fonctionne très bien, pas de le remplacer par autre chose.
    Cordialement.

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    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
    $ man mapfile
    Aucune entrée de manuel pour mapfile
    $ help mapfile
    mapfile: mapfile [-d délim] [-n nombre] [-O origine] [-s nombre] [-t] [-u fd] [-C callback] [-c quantum] [tableau]
        Lit des lignes depuis l'entrée standard vers une variable tableau indexé.
     
        Lit des lignes depuis l'entrée standard vers la variable tableau indexé TABLEAU ou
        depuis le descripteur de fichier FD si l'option « -u » est utilisée. La variable
        MAPFILE est le TABLEAU par défaut.
     
        Options :
          -d delim  Utilise DELIM pour terminer les lignes au lieu du saut de ligne
          -n nombre Copie au maximum NOMBRE lignes.  Si NOMBRE est 0, toutes les lignes sont copiées.
          -O origine        Commence l'affectation au TABLEAU à l'indice ORIGINE.  L'indice par défaut est 0.
          -s nombre Saute les NOMBRE premières lignes lues.
          -t        Retire les retours à la ligne de chaque ligne lue.
          -u fd     Lit les lignes depuis le descripteur de fichier FD au lieu de l'entrée standard.
          -C callback       Évalue CALLBACK à chaque fois que QUANTUM lignes sont lues.
          -c quantum        Indique le nombre de lignes lues entre chaque appel au CALLBACK.
     
        Arguments :
          TABLEAU   Nom de la variable tableau à utiliser pour les données.
     
        Si l'option « -C » est fournie sans option « -c », le quantum par défaut est 5000.
        Lorsque CALLBACK est évalué, l'indice du prochain élément de tableau qui sera affecté
        lui est transmis comme argument additionnel.
     
        Si la commande « mapfile » n'est pas appelée avec une origine explicite, le tableau est
        vidé avant affectation.
     
        code de retour :
        Renvoie le code de succès à moins qu'une option non valable ne soit donnée ou que
        le TABLEAU soit en lecture seule ou ne soit pas un tableau indexé.
    mapfile n'est pas une commande externe, mais interne.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    J'obtient le même résultat avec help a la place de man.

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    M'enfin

    Quel interpréteur de commande utilises-tu ? "echo $0"
    Quelle version de cet interpréteur utilises-tu ? "bash --version" par exemple.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    je trouve étrange que tu aies mapfile mais pas l'option -a de read.
    on peut voir le help read qu'affiche ton système, s'il te plaît ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    L'interpréteur est ksh qui vient en standard sur OpenBSD.
    Il n'y a pas d'option version.
    La page de man :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    VERSION
               This page documents version @(#)PD KSH v5.2.14 99/07/13.2 of the public
               domain Korn shell.
    de plus, je l'utilise avec #!/bin/sh , ce qui limite encore les options.

  11. #11
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Effectivement, ksh n'a pas de mapfile ou readarray.

    Cela dépend alors de ton but. Si un script awk avec un séparateur "," peut faire le job, fais-le.

    Exemple: ce script compte le nombre de champs supérieurs à 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ',' '{n=0; for (i=1;i<=NF;i++) if ($i>1) n++; print NR, n;}' fichier
    Pas besoin de connaître le nombre de champs à l'avance et le séparateur est bien la virgule.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

Discussions similaires

  1. lecture d'une table avec boucle + variable à alimenter et à réinitialiser
    Par paris11 dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 22/05/2014, 16h14
  2. Réponses: 10
    Dernier message: 27/01/2006, 09h43
  3. syntaxe "UPDATE" (lecture d'une valeur avec jointu
    Par mrblue1978 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/01/2006, 14h38
  4. Utilisation d'une variable avec l'instruction 'USE'
    Par florantanplan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/11/2005, 10h39
  5. Désigner une variable avec une variable?
    Par littleman dans le forum Paradox
    Réponses: 4
    Dernier message: 12/08/2002, 11h21

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