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 :

shell - traiter des fichiers - mots


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 8
    Par défaut shell - traiter des fichiers - mots
    Bonjour,

    Je suis débutant en shell, j'aimerais savoir comment traiter cette question en shell posée dans mon tp : Donner les noms des employés qui sont alphabétiquement compris entre «D» et «N».

    la base de donnée est base.txt:

    7369 SMITH CLERK 7902 17-DEC-80 800 20
    7499 ALLEN SALESMAN 7698 20-FEB-81 1600 30
    7521 WARD SALESMAN 7698 22-FEB-81 1250 30
    7566 JONES MANAGER 7839 02-APR-81 2975 20
    7654 MARTIN SALESMAN 7698 28-SEP-81 1250 30
    7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
    7782 CLERK MANAGER 7839 09-JUN-81 2450 10
    7788 SCOTT ANALYST 7566 09-DEC-82 3000 20
    7839 KING PRESIDENT 7839 17-NOV-81 5000 10
    7844 TURNER SALESMAN 7698 08-SEP-81 1500 30
    7876 ADAMS CLERK 7788 12-JAN-83 1100 20
    7900 JAMES CLERK 7698 03-DEC-81 950 30
    7902 FORD ANALYST 7566 03-DEC-81 3000 20
    7934 MILLER CLERK 7782 23-JAN-82 1300 10
    Bien que j'ai utilisé grep et cut rien ne fonctionne.

    Merci pour toute éventuelle aide.

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

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

    le shell (bash en tous cas) peut faire ça sans recourir à des programmes externes :
    1/ Comment lire/parcourir un fichier en shell
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 8
    Par défaut
    Bonjour

    Je ne trouve la réponse à ma question sur ces liens.

    cordialement

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    c'est dans le premier, je confirme.

    mais évidemment, ce n'est pas donné tout cuit, il faut adapter !

    en bash, tu utiliseras avantageusement le test avancé [[, plutôt que [, ou test.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

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

    Je confirme que 1 grep et un cut sont suffisants. Ne dis pas que rien ne marche.

  6. #6
    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,

    Citation Envoyé par Flodelarab Voir le message
    Je confirme que 1 grep et un cut sont suffisants. Ne dis pas que rien ne marche.
    Je confirme qu'un grep¹ seul suffit



    ¹ Et son option -P (Po pour être exact)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 294
    Par défaut
    Je confirma qu'un seul grep suffit et sans connaître le perl dans le cas présent

  8. #8
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    si on veut se la peter grave en cours, on peut faire ça avec un sed aussi


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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 294
    Par défaut
    Ou un simple 'echo'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo -e "JONES\nMARTIN\nKING\nJAMES\nFORD\nMILLER"
    Ok, je sors.
    (Je suis déjà dehors)

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 373
    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 373
    Par défaut
    Perso,
    Je trouve qu'on se la pète plus si on le fait en builtin comme suggéré par N_BaH,
    Essayons donc de mettre un peu de piment dans le petit défi:
    Est-il possible de le faire rien qu'en builtin sans utiliser explicitement la boucle, donc sans select, for, while (le pipe n'est pas interdit) ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    je voudrais voir ça
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 373
    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 373
    Par défaut
    Quand j'ai posé la question, c'est parce que je ne savais pas si c'était possible, mais en fait, c'est possible et même sans le pipe :
    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
    $ cat fifi
    7369 SMITH CLERK 7902 17-DEC-80 800 20
    7499 ALLEN SALESMAN 7698 20-FEB-81 1600 30
    7521 WARD SALESMAN 7698 22-FEB-81 1250 30
    7566 JONES MANAGER 7839 02-APR-81 2975 20
    7654 MARTIN SALESMAN 7698 28-SEP-81 1250 30
    7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
    7782 CLERK MANAGER 7839 09-JUN-81 2450 10
    7788 SCOTT ANALYST 7566 09-DEC-82 3000 20
    7839 KING PRESIDENT 7839 17-NOV-81 5000 10
    7844 TURNER SALESMAN 7698 08-SEP-81 1500 30
    7876 ADAMS CLERK 7788 12-JAN-83 1100 20
    7900 JAMES CLERK 7698 03-DEC-81 950 30
    7902 FORD ANALYST 7566 03-DEC-81 3000 20
    7934 MILLER CLERK 7782 23-JAN-82 1300 10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ fu () { [[ $2 =~ ^[D-Nd-n] ]] && printf "${2// */}\n" ; shift 7 ; [[ $# -ne 0 ]] && fu $* ; } && fu $(<fifi)
    JONES
    MARTIN
    KING
    JAMES
    FORD
    MILLER

  13. #13
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Il ya a plus court, plus fiable et plus portable (POSIX) tout en respectant les mêmes contraintes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ fu() { read f n b||return;case $n in [D-Nd-n]*) echo $n;;esac;fu; } ;fu<fifi
    JONES
    MARTIN
    KING
    JAMES
    FORD
    MILLER

  14. #14
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 373
    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 373
    Par défaut
    J'aime beaucoup l'utilisation du read ici

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut


    un petit bémol : printf est censé être utilisé pour séparer la mise en forme et les données.
    si on ne le fait pas, autant utiliser echo.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  16. #16
    Membre expérimenté
    Homme Profil pro
    [SciComp]
    Inscrit en
    Août 2013
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : [SciComp]

    Informations forums :
    Inscription : Août 2013
    Messages : 134
    Par défaut
    Super les solutions shell_only !
    Après, je doute que ce soit compatible avec tous les shells (c-shell par exemple ?).
    Cela rend l'utilisation de programmes "externes" confortable. Je doute en effet qu'on ne puisse pas trouver un grep, cut, sed voire awk sur un système avec un [ba,c,tc,k,z,...]sh.
    Allez, n'ayant pas encore été donnée en awk, voici une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{if ($2 ~ /^[D-Nd-n]/) {print $2;}}' data.txt
    Quelqu'un a proposé en sed, et j'aimerais beaucoup voir la solution !

    Pour cut et grep, c'est assez simple aussi, et j'ai l'impression que c'est ta question. Donc indice: sélectionner le second champ de chaque ligne avec cut (les options -f et -d que tu trouveras dans un "man cut" t'intéresseront sûrement...), et avec grep chercher les patterns correspondants à tes besoins (patterns que tu pourras trouver dans les solutions qui t'ont été données). Une fois compris l'utilisation de cut et grep, dirige le flux de cut vers grep avec une pipe, et tu as une commande self-contained et très simple.

    A toi de jouer, et surtout de comprendre !

  17. #17
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 373
    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 373
    Par défaut
    Une solution sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n -e 's/^[0-9]* \([D-Nd-n][^ ]*\).*/\1/p' fifi

  18. #18
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 373
    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 373
    Par défaut
    Citation Envoyé par N_BaH Voir le message


    un petit bémol : printf est censé être utilisé pour séparer la mise en forme et les données.
    si on ne le fait pas, autant utiliser echo.
    Merci, cela m'a donné une idée sans création de fonction et qui respecte les contraintes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval $(printf "echo '%s %s %s %s %s %s %s'| (read a a b; case \$a in [D-Nd-n]*) echo \$a;;esac);\n" $(<fifi))
    Bon, elle fonctionne avec l'input donnée mais ne surtout pas utiliser dans la vrai vie

  19. #19
    Membre expérimenté
    Homme Profil pro
    [SciComp]
    Inscrit en
    Août 2013
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : [SciComp]

    Informations forums :
    Inscription : Août 2013
    Messages : 134
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Une solution sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n -e 's/^[0-9]* \([D-Nd-n][^ ]*\).*/\1/p' fifi
    OK ! A chaud, je n'avais pas pensé à utiliser une regexp pour accéder à un champ donné...
    Nice, merci disedorgue.

  20. #20
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 373
    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 373
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Je confirma qu'un seul grep suffit et sans connaître le perl dans le cas présent
    Là, je veux bien la solution...

Discussions similaires

  1. Script Shell sur des fichiers et chaînes
    Par chris_wafer dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 29/01/2008, 21h45
  2. extraire et traiter des fichiers log
    Par charlix dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 21/09/2007, 13h54
  3. Traiter des fichiers un a un
    Par Paloma dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 02/11/2006, 10h47
  4. Réponses: 7
    Dernier message: 15/06/2006, 17h36

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