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 :

Récupération des extensions de fichier


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 24
    Points : 30
    Points
    30
    Par défaut Récupération des extensions de fichier
    Bonjour,

    Je souhaite récupérer les extensions de fichiers. J'ai un fichier contenant n lignes à lire, chaque ligne termine par un .extension par ivantes :

    gghhhhhhhhhhhhhhhhhhfichier-2.0.2.txt
    iuuuuuuuuuuuuuotemplate-8.2.1.war
    deploiementfghhuyiioppppp-1.3.5.tar
    ------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!/bin/sh
     
    f_test()
    {
    	while read line
    	do
    		extension=$(echo "${line}" | sed 's/[^0-9].*/g')
                    echo $extension >>extension.log
    	done < fichier.txt
    }
    f_test

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    sed est suffisant, pas la peine de faire une boucle !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/.*\.\([^.]*$\)/\1/' fichier.txt >extension.log
    Cordialement.

  3. #3
    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
    Bonjour,

    quel est le résultat attendu ?
    quel est le problème avec la commande actuelle ?

    et, s'il vous paît, relisez-vous avant de poster. on ne comprend pas :
    chaque ligne termine par un .extension par ivantes
    ce qui vous semble évident parce que vous êtes devant votre écran , nous est totalement inconnu.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    sed est suffisant, pas la peine de faire une boucle !!!
    Ou alors, si tu veux faire une boucle, n'utilise pas sed (mais utiliser directement sed est mieux) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while read line
    do
      echo "${line##*.}"
    done < fichier.txt > extension.log

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Ou un pur bash sans boucle while ou for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :|mapfile -c1 -C 'f(){ echo ${2##*.};};f' <fichier.txt
    Je vous laisse comprendre toute la subtilité de la ligne (le :| au début n'est pas un prompt, il fait partie de la commande)
    Cordialement.

  6. #6
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut Et grep ?
    Salut,

    Il y a grep aussi qui peut faire le job :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat fich 
    gghhhhhhhhhhhhhhhhhhfichier-2.0.2.txt
    iuuuuuuuuuuuuuotemplate-8.2.1.war
    deploiementfghhuyiioppppp-1.3.5.tar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ grep -oP '.*\.\K.*' fich 
    txt
    war
    tar
    ;-)
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  7. #7
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ou un pur bash sans boucle while ou for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :|mapfile -c1 -C 'f(){ echo ${2##*.};};f' <fichier.txt
    Je vous laisse comprendre toute la subtilité de la ligne (le :| au début n'est pas un prompt, il fait partie de la commande)
    Le :| est seulement là pour que le mapfile s'exécute dans un sous-shell (et donc que le tableau MAPFILE soit éliminé en sortie), ou il y a autre chose ?
    En tout cas je suis un peu surpris de voir que cette formulation est plus lente que la boucle while, d'un facteur 2 chez moi pour 10 000 lignes dans fichier.txt, même si sortir la définition de f du mapfile améliore un peu les choses.

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Oui, le :| ne sert qu'à ça...

    Il est vrai que c'est plus lent que la boucle while car en fait, on appelle la fonction f qui appelle echo autant de fois qu'il y a de ligne, alors que la boucle while n'appelle que echo...

    Après, on peut être plus rapide que la boucle while, toujours avec mapfile:
    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
    $ time mapfile -c1 -C 'f' <fichier2.txt >/dev/null 
     
    real	0m0,213s
    user	0m0,212s
    sys	0m0,000s
    $ time while read line; do   echo "${line##*.}"; done < fichier2.txt >/dev/null 
     
    real	0m0,127s
    user	0m0,108s
    sys	0m0,019s
    $ time { mapfile XX <fichier2.txt ; echo "${XX[@]##*.}" ; } >/dev/null 
     
    real	0m0,051s
    user	0m0,051s
    sys	0m0,000s
    Cordialement.

  9. #9
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Avec awk :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     awk -F'.' '{ print $NF }' < fichier2.txt  > extension.txt

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 24
    Points : 30
    Points
    30
    Par défaut
    Merci beaucoup à tous

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    sed est suffisant, pas la peine de faire une boucle !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/.*\.\([^.]*$\)/\1/' fichier.txt >extension.log
    Euh... Je me trompe ou l'étoile est gourmande ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/.*\.//' fichier.txt > extension.log

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Oui, c'est juste une déformation de ma part: écrire une regex qui dit exactement ce qu'elle fait sur la chaîne entière mais il est vrai que l'on peut simplifier.
    Cordialement.

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

Discussions similaires

  1. test sur des extensions de fichiers script CSH
    Par Ferzed dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 16/06/2009, 10h58
  2. Modifier des extensions de fichiers
    Par simono dans le forum Langage
    Réponses: 2
    Dernier message: 29/03/2008, 15h18
  3. Récupération des noms de fichiers d'un même dossier
    Par Contractofoued dans le forum MATLAB
    Réponses: 5
    Dernier message: 16/11/2007, 11h45
  4. récupération des noms de fichiers existant dans un répertoire
    Par tangjuncn dans le forum Général VBA
    Réponses: 1
    Dernier message: 06/11/2007, 20h12
  5. Liste des extensions de fichier gérée par Windows
    Par rezuss dans le forum Delphi
    Réponses: 2
    Dernier message: 10/07/2007, 17h21

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