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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    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 chevronné

    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
    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 confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    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 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    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 !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    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 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
    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 '_'

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, 17h31
  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, 13h48
  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, 13h53
  4. Compter le nombre de caractères dans une chaine
    Par Delabrfi dans le forum Langage
    Réponses: 2
    Dernier message: 11/03/2014, 21h28
  5. COmpter le nombre de caractére dans une variable
    Par oliv27400 dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/06/2010, 15h17

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