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 :

Compter le nombre de caractères dans le titre d'un fichier


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Points : 8
    Points
    8
    Par défaut Compter le nombre de caractères dans le titre d'un fichier
    Bonjour,

    J'ai reçois dans un répertoire des fichiers nommés sous la forme suivante :

    NOM.DATE_heure_caractère1_caractère2_caractère3_caractère4_caractère5_caractère6.zipJe cherche à faire un script qui compte le nombre de parties du nom du fichier.
    Une partie est séparée par le séparateur "_"

    J'ai réussis à compter le nombre de parties pour chaque fichier en redirigeant le contenu du listing du répertoire dans un fichier et le en traitant avec la commande awk de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in `cat liste.txt  | awk '{cnt=0 ; for(i=1; i<=NF; i++) {if($i != "") {cnt++}} {print   "  "cnt" "}}' FS="_"`
    do
    echo $i
    Seulement j'aimerai pouvoir associer au nombre de parties retourné, le nom du fichier mais je n'arrive pas à le faire.

    Avez-vous des idées?

    Merci

  2. #2
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $echo a_b_c_d |awk -F_ '{ print $0 ":" NF }'
    a_b_c_d:4

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 276
    Points : 13 553
    Points
    13 553
    Par défaut
    Bonjour

    • Faire un cat avant un awk est inutile.
    • Si tu veux splitter ton nom de fichier a l'intérieur d'un script awk, je te conseille de lire la discussion "Convertir le nom de fichier csv en variable" à laquelle je viens de répondre à ta question.

      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
      $ ls *.csv
      P-Mesh__bitreverse_512_1E-3_1.csv  P-Mesh__bitreverse_512_1E-3_2.csv  P-Mesh__bitreverse_512_1E-3_4.csv  P-Mesh__bitreverse_512_1E-3_8.csv
      $ awk 'FNR==1{nb_param=split(FILENAME,param,"[_.]");print nb_param" param:";for (i=1;i<=nb_param;i++) print param[i];print ""}' *.csv
      7 param:
      P-Mesh
       
      bitreverse
      512
      1E-3
      1
      csv
       
      7 param:
      P-Mesh
       
      bitreverse
      512
      1E-3
      2
      csv
       
      7 param:
      P-Mesh
       
      bitreverse
      512
      1E-3
      4
      csv
       
      7 param:
      P-Mesh
       
      bitreverse
      512
      1E-3
      8
      csv
       
      $
      nb_param contient ton nombre de paramètres

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    Bonjour,

    du bash, rien que du bash :
    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
    $ for f in *.csv; do IFS="_" read -a a <<<"$f"; echo "$f : ${#a[@]}"; printf '%s\n' "${a[@]}"; echo; done
    P-Mesh__bitreverse_512_1E-3_1.csv : 6
    P-Mesh
     
    bitreverse
    512
    1E-3
    1.csv
     
    P-Mesh__bitreverse_512_1E-3_2.csv : 6
    P-Mesh
     
    bitreverse
    512
    1E-3
    2.csv
     
    P-Mesh__bitreverse_512_1E-3_4.csv : 6
    P-Mesh
     
    bitreverse
    512
    1E-3
    4.csv
     
    P-Mesh__bitreverse_512_1E-3_8.csv : 6
    P-Mesh
     
    bitreverse
    512
    1E-3
    8.csv
    bash pour toujours !

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 311
    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 311
    Points : 12 830
    Points
    12 830
    Par défaut
    Bonjour,
    Une autre pour faire plaisir à N_BaH
    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
    $ ls *.csv
    tata__c1_c2_c3.csv  titi_c1_c2_c3.csv  toto_c1_c2_c3.csv
    $ for i in *.csv; do echo -e "$i : $(set -- ${i//_/\" \"} && echo $#\\n${i//_/\\n})"; done
    tata__c1_c2_c3.csv : 5
    tata
     
    c1
    c2
    c3.csv
    titi_c1_c2_c3.csv : 4
    titi
    c1
    c2
    c3.csv
    toto_c1_c2_c3.csv : 4
    toto
    c1
    c2
    c3.csv

  6. #6
    Membre averti
    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
    Points : 323
    Points
    323
    Par défaut
    Bonjour,

    Une remarque:
    Dans les solutions précédentes, lorsque 2 "_" sont juxtaposés, cela suppose l'existence d'un champ (certes vide) entre les deux. Pour un usage que j'ai rencontré, j'ai eu besoin que dans de tels cas, il soit vu l'absence de champs (c'était pour vérifier l'homogénéïté du format des noms de fichiers, i.e. le non oubli de champs).
    Avec wc par exemple, ça donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for filename in f_i_l_e_n_a_m_e f____n_a_m_e; do
      echo $filename : $(echo $filename | sed 's/_/ /g' | wc -w)
    done
    qui retourne 8 et 5 (donc dans f____n_a_m_e il manque bien 3 parties).

    Une question:
    Avec des blancs en séparateur, awk ferait la même chose (par ex. en remplaçant wc -w par awk 'print NF' dans le code précédent), mais avec des underscores, awk suppose un champs entre chaque FS.
    Une idée pour paramétrer le comportement de awk sur les éventuelles répétitions de séparateurs de champs ?

    =========== EDIT 09h28 ============
    Je n'avais pas réfléchi suffisamment avant de poster... car j'ai trouvé une solution...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for filename in f_i_l_e_n_a_m_e f____n_a_m_e; do
      echo $filename | awk -F'_*' '{ print $0 " : " NF;}'
    done
    qui fait le job correctement... Soit décrire le FS avec '_*' et non simplement '_'

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 276
    Points : 13 553
    Points
    13 553
    Par défaut
    Cette objection est infondée puisque chacune des trois solutions qui ont été apportées montre bien que les champs vides sont pris en compte (donnant des lignes vides)

    La faute de cette objection vient du fait d'utiliser 'wc' pour compter les champs. Bien mauvaise méthode.

    Enfin, inutile de changer les '_' en ' '. Il suffit d'indiquer à awk que '_' est un séparateur de champ.
    En ce qui me concerne j'avais indiqué '_' et '.' comme séparateurs dans tes noms de fichiers..

Discussions similaires

  1. [A-00] Compter le nombre de caractère dans une zone de texte
    Par etoileetoile dans le forum VBA Access
    Réponses: 5
    Dernier message: 23/05/2024, 18h31
  2. [SQL] Compter le nombre de caractères dans une chaine
    Par VuVietHai dans le forum SAS Base
    Réponses: 3
    Dernier message: 08/09/2014, 14h48
  3. [Débutant] compter le nombre de caractères dans une phrase saisie
    Par gnamienbenedicte dans le forum C#
    Réponses: 3
    Dernier message: 25/04/2014, 14h53
  4. Compter le nombre de caractères dans une chaine
    Par Delabrfi dans le forum Langage
    Réponses: 2
    Dernier message: 11/03/2014, 22h28
  5. COmpter le nombre de caractére dans une variable
    Par oliv27400 dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/06/2010, 16h17

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