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 :

Calculer efficacement le nombre de champs d'une string


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut Calculer efficacement le nombre de champs d'une string
    Bonjour.

    Petit problème de débutant!

    J'ai une chaîne 'un_champ:un_autre_champ:encore_un' qui contient, sur une seule ligne, des champs séparés par le séparateur ':'.
    Je voudrais calculer le nombre de champs de cette chaîne.

    J'ai bien la solution extrêmement simple avec awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typeset LISTE='un_champ:un_autre_champ:encore_un'
    typeset -i nf=$(print "${LISTE}" | awk -F ":" '{print NF}')
    print ${nf}
    3
    mais je la soupçonne d'être passablement coûteuse... surtout pour une petite chaîne!

    ou la solution de suppression des autres caractères avec sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typeset LISTE='un_champ:un_autre_champ:encore_un'
    typeset lif=$(print "${LISTE}" | sed -e 's/[^:]//g')
    typeset -i nf=$((${#lif} + 1))
    print ${nf}
    3
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typeset LISTE='un_champ:un_autre_champ:encore_un'
    typeset -i nf=$(print "${LISTE}" | sed -e 's/[^:]//g' | wc -c) 
    print ${nf}
    3
    Les spécialistes savent-ils quelle solution (parmi celles-ci ou d'autres, valables pour ksh) est la plus efficace?

  2. #2
    Membre expérimenté
    Avatar de l4r3nZu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2010
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2010
    Messages : 154
    Par défaut
    Je n'ai pas tester ma commande mais ca doit etre un truc dansle genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wc -l $($(echo"tt:tt:tt" | cut -d":"))

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

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

    en bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ string="un_champ:un_autre_champ:encore_un"
    $ nf="${string//[^:]/}"
    $ echo $((${#nf}+1))
    3
    il n'y a pas de raisons que ça ne fonctionne pas avec ksh.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Merci d'avoir répondu.

    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    en bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ string="un_champ:un_autre_champ:encore_un"
    $ nf="${string//[^:]/}"
    $ echo $((${#nf}+1))
    3
    il n'y a pas de raisons que ça ne fonctionne pas avec ksh.
    C'est ce qu'on va voir... et c'est tout vu!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # Sous AIX
    $ nf="${string//[^:]/}"
    ksh: nf="${string//[^:]/}": 0403-011 The specified substitution is not valid for this command.
     
    # Sous linux
    $ nf="${string//[^:]/}"
    ksh: : bad substitution
    Mais, c'était bien essayé!

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    il faudrait trouver des noms différents pour des shells qui ont un comportement aussi différent !

    évidemment, avec ksh Version AJM 93u+ 2012-08-01, je n'ai pas de problème avec ces commandes.

    dans la même idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ nf=$(echo "$string" | tr -d -c ':')
    $ echo $((${#nf}+1))
    3
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    en bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ string="un_champ:un_autre_champ:encore_un"
    $ nf="${string//[^:]/}"
    $ echo $((${#nf}+1))
    3
    il n'y a pas de raisons que ça ne fonctionne pas avec ksh.
    Citation Envoyé par N_BaH Voir le message
    il faudrait trouver des noms différents pour des shells qui ont un comportement aussi différent !
    Je confirme l'erreur sous KSH Version M-11/16/88f sous AIX et en KSH Version M-11/16/88i sous Solaris, et en 11/16/88 sous HP-UX...

    Neanmoins, c'est probablement la version la plus rapide que l'on peut obtenir, car il n'y a pas d'indirection (pipe ou autres).
    Reste a faire un portage sous des vieux KSH

    PS : la version avec "echo | tr" fonctionne bien
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Merci d'avoir répondu!

    Citation Envoyé par l4r3nZu Voir le message
    Je n'ai pas tester ma commande
    Ah ben, oui, je confirme!

    mais ca doit etre un truc dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wc -l $($(echo"tt:tt:tt" | cut -d":"))
    En fait, cut sert à extraire des champs, mais ne permet pas de les "séparer" par des returns!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # sous linux:
    echo $string | cut -d":"      
    cut: you must specify a list of bytes, characters, or fields
     
    # sous AIX:
    echo $string | cut -d":"
    Usage: cut -b List [-n] [File...]
       or: cut -c List [File...]
       or: cut -f List [-d Character] [-s] [File...]
    Mais, du coup, ça me fait penser à une autre solution avec 'tr' et 2 pipes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typeset -i nf=$(print "${string}" | tr ':' '\n' | wc -l)
    Rq: le 'typeset -i' permet de supprimer le formatage introduit par wc sous AIX.

Discussions similaires

  1. Calcul d'un nombre de caractères dans une chaîne
    Par Thekiller dans le forum Langage
    Réponses: 7
    Dernier message: 08/02/2010, 23h21
  2. Compter le nombre de champs d'une table
    Par alexsimps dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 22/07/2007, 08h03
  3. Nombre de champs d'une base
    Par lohot dans le forum Bases de données
    Réponses: 1
    Dernier message: 09/02/2007, 23h11
  4. grand nombre de champ dans une table
    Par drinkmilk dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/06/2006, 18h54
  5. Nombre de champs d'une table
    Par cege dans le forum Access
    Réponses: 4
    Dernier message: 25/01/2005, 17h57

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