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. #21
    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 disedorgue Voir le message
    Là, je veux bien la solution...
    Euh... sans connaître le Perl (comme moi), mais avec juste un peu de Perl alors...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -Po '^[^ ]* \K[D-N][^ ]*' fichier

  2. #22
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 424
    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 424
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    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
    Comme je ne trouvais pas la solution super, voici 1 autre version a peu près pareil, donc aussi sans création de fonction et cette fois-ci sans pipe (par contre toujours avec eval mais un peu plus maitrisé par '%q' au lieu de '%s' )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ $(printf "eval a=%q;a=%q;b='%q%q%q%q%q';case \$a in [D-Nd-n]*) echo \$a;;esac;\n" $(<fifi))
    Si on avait garder '%s' au lieu de '%q', on aurait pas pu avoir des lignes du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    7934 MI;ls;LLER CLERK 7782 23-JAN-82 1300 10
    Citation Envoyé par zipe31 Voir le message
    Salut,



    Euh... sans connaître le Perl (comme moi), mais avec juste un peu de Perl alors...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -Po '^[^ ]* \K[D-N][^ ]*' fichier
    On est ok, mais il y a l'ombre de perl ici, moi je voulais une version sans et en un seul grep (pour moi, ce n'est pas possible, mais je me trompe peut-être).

  3. #23
    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
    Citation Envoyé par disedorgue Voir le message
    On est ok, mais il y a l'ombre de perl ici, moi je voulais une version sans et en un seul grep (pour moi, ce n'est pas possible, mais je me trompe peut-être).
    Je pense que l'ami Flodelarab c'est un peu trompé dans sa réponse en rapport avec mes dires, où je précisais bien en ¹ : Et son option -P (Po pour être exact)

    Donc, non sans cette option, grep ne peut le faire

  4. #24
    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
    Plus concis en awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{$0=$2}/^[D-N]/' fifi

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 307
    Par défaut
    Puisque vous avez tous craqué et donné toutes les réponses, je donne les versions auxquelles j'ai pensé tout du long:
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    $ cut -d' ' -f2 texte.txt|grep "^[D-N]"
    JONES
    MARTIN
    KING
    JAMES
    FORD
    MILLER
    $ grep -o " [D-N][A-Z]\{0,5\} " texte.txt 
     JONES 
     MARTIN 
     KING 
     JAMES 
     FORD 
     MILLER 
    $ sed -n '/^[0-9]* [D-N]/p' texte.txt 
    7566 JONES MANAGER 7839 02-APR-81 2975 20
    7654 MARTIN SALESMAN 7698 28-SEP-81 1250 30
    7839 KING PRESIDENT 7839 17-NOV-81 5000 10
    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
    $ sed -n 's/^[0-9]* \([D-N][A-Z]*\).*/\1/p' texte.txt 
    JONES
    MARTIN
    KING
    JAMES
    FORD
    MILLER
    $ awk '($2 ~ /^[D-N]/){print $2;}' texte.txt 
    JONES
    MARTIN
    KING
    JAMES
    FORD
    MILLER
    $ shopt -s extglob;a="$(<texte.txt)"; a="${a//[0-9][0-9][0-9][0-9] /ç}";a="${a// ç[0-9]/ }";a="${a// / }";a="${a//+([^ç])/ }";a="${a//ç[^D-N]+([A-Z]) }";a="${a// ç/\n}";a=${a//ç};echo -e "$a";shopt -u extglob;
    JONES
    MARTIN
    KING
    JAMES
    FORD
    MILLER
    [edit]Y a un probleme d'affichage sur le forum pour la der ligne:
    $ shopt -s extglob;a="$(<texte.txt)"; a="${a//[0-9][0-9][0-9][0-9] /ç}";a="${a// ç[0-9]/ }";a="${a// / }";a="${a//+([^ç])/ }";a="${a//ç[^D-N]+([A-Z]) }";a="${a// ç/\n}";a=${a//ç};echo -e "$a";shopt -u extglob;
    [/edit]
    [edit2]shopt -s extglob;a="$(<texte.txt)"; a="${a//[0-9][0-9][0-9][0-9] /ç}";a="${a// ç[0-9]/ }";a="${a// /à }";a="${a//à+([^ç])/ }";a="${a//ç[^D-N]+([A-Z]) }";a="${a// ç/\n}";a=${a//ç};echo -e "$a";shopt -u extglob;
    [/edit2]

  6. #26
    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
    Citation Envoyé par Flodelarab Voir le message
    Puisque vous avez tous craqué et donné toutes les réponses, je donne les versions auxquelles j'ai pensé tout du long:
    Y'a quand même de grand malade

  7. #27
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 424
    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 424
    Par défaut
    N'empêche que moi, je trouve ça beau...

    Bon, le coup du grep -o qui fonctionne...Hmmm

    Par contre, la dernière solution de Flodelarab, c'est une voie que j'avais exploré sans succès car j'ai pas pensé à l'option extglob (et d'ailleurs, j'y pense jamais à ces divers shopt ), donc

    Bon, j'espère que programmation_ en aura profité pour apprendre des choses et n'aura pas fait juste un copier/coller.

  8. #28
    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
    Le résultat des solutions proposées est:

    JONES
    MARTIN
    KING
    JAMES
    FORD
    MILLER


    Mais la solution sauf erreur de ma part doit être:

    KING puisque ce mot est compris alphabétiquement entre D et N.

    Merci quand même ^^

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 738
    Par défaut
    Mais la solution sauf erreur de ma part doit être:

    KING puisque ce mot est compris alphabétiquement entre D et N.
    mais bien sûr, c'est une requête tellement fréquente : «trouver le mot, dont toutes les lettres, qui le composent, sont comprises entre deux lettres» !

  10. #30
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 424
    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 424
    Par défaut
    Le problème est étrange et surtout très mal posé.
    J'imagine bien aller dans une bibliothèque et voir un rangement des livres comme ça.
    Mais comme en mathématique, lorsque l'énoncé est ambigu, la réponse est considérée comme bonne si elle répond à l'une des ambiguités.

    M'enfin, de toute façon, cela ne change pas grand chose aux solutions données, il faut juste réadapter l'expression régulière.

    Sinon, on peut aussi jouer sur ce type de registre et dire que seul le résultat compte (après tout, on n'est pas obligé de dévoiler les sources du programme) et donc:
    Répond à la question...

  11. #31
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 424
    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 424
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ fu () { [[ "$2 " =~ ^[D-N][^A-CO-Z]*[D-N]\  ]] && printf "${2// */}\n" ; shift 7 ; [[ $# -ne 0 ]] && fu $* ; } && fu $(<fifi)
    KING
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ sed -n -e 's/^[0-9]* \([D-Nd-n]\+\) .*/\1/p' fifi
    KING
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ eval $(printf "echo '%s %s %s %s %s %s %s'| (read a a b; case \"\$a \" in [D-N][^A-CO-Z]*[D-N]\ ) echo \$a;;esac);\n" $(<fifi))
    KING
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ $(printf "eval a=%q;a=%q;b=%q%q%q%q%q;case \"\$a \" in [D-N][^A-CO-Z]*[D-N]\ ) echo \$a;;esac;\n" $(<fifi))
    KING

  12. #32
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk '{$0=$2}/^[D-N]+$/' fifi
    KING

  13. #33
    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
    Je vous remercie de votre aide.

    J'aimerais avoir des explications sur cette instruction proposée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk '{$0=$2}/^[D-N]+$/' base.txt

  14. #34
    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
    Cette commande utilise des spécificités du langage awk qui ne sont pas spécialement intuitives ou didactiques, surtout pour un débutant.

    L'objectif était pour moi de rechercher la commande la plus courte répondant à l'interprétation absurde de l'énoncé du TP en question.

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, 22h45
  2. extraire et traiter des fichiers log
    Par charlix dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 21/09/2007, 14h54
  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, 11h47
  4. Réponses: 7
    Dernier message: 15/06/2006, 18h36

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