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

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    février 2013
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2013
    Messages : 493
    Points : 155
    Points
    155

    Par défaut Ajouter un mot contenu dans le nom du répertoire au début de chaque ligne d'un fichier

    Bonjour,

    Je voudrais savoir comment ajouter au début de chaque ligne des fichiers file.txt le numéro de leur répertoire (le nombre sur leur noms) et récupérer leur contenu dans un même fichier.

    Arborescence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    -  rep
     
    -- rep1
    --- file.txt
     
    -- rep2
    --- file.txt
     
    -- repn
    --- file.txt

    Pour récupérer les contenus de chaque fichiers file.txt, j'ai trouvé cette commande là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tail -q  rep*/file.txt > output.txt
    Je présente l’entièreté de ce que je souhaite faire pour voir si l'on peut le faire avec une seul commande qui serait sans doute plus optimisé ou en deux commandes séparé (ajout au début de chaque ligne + récupération du contenu)


    Par exemple je souhaite avoir cela

    rep1/file.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    aaaaa aaaa  aaaa  aaa
    aa aaa aa aa aaa
    Après la commande qui ajoute le numéro de répertoire sur chaque ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1 aaaaa aaaa  aaaa  aaa
    1 aa aaa aa aa aaa

  2. #2
    Expert éminent Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    3 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 3 605
    Points : 8 651
    Points
    8 651

    Par défaut

    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ((i=1;i<=n;i++)); do sed 's/^/'"$i"' /' "rep/rep${i}/file.txt"; done > output.txt
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.
    Votre problème est résolu ? Cliquez sur en bas de page.

    Linux, grep/sed/awk/xml... et autres fichiers plats, Java, C++

  3. #3
    Membre expert Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    1 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : mars 2009
    Messages : 1 577
    Points : 3 293
    Points
    3 293

    Par défaut

    Avec awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{a=FILENAME; gsub("^rep/rep|/.*", "", a); print a, $0}' rep*/file.txt > output.txt
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    février 2013
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2013
    Messages : 493
    Points : 155
    Points
    155

    Par défaut

    Bonjour,

    J'avais pensé à une boucle for mais je me disais qu'il y avait sans doute une commande qui faisait l’équivalent.

    Pour la commande, il y a un moyen de mettre une variable dans la partie gsub malgré que se soit une chaine de caractère ?
    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    path=~/rep
    awk '{a=FILENAME; gsub("^'$path'/rep|/.*", "", a); print a, $0}' rep*/file.txt > output.txt

  5. #5
    Membre expert Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    1 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : mars 2009
    Messages : 1 577
    Points : 3 293
    Points
    3 293

    Par défaut

    Tu peux définir des variables dans awk avec l'option -v:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v toto="chaine" '{print toto}' file
    Mais regarde avant si tu ne peux pas trouver ton bonheur dans les variables prédéfinies de awk.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    février 2013
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2013
    Messages : 493
    Points : 155
    Points
    155

    Par défaut

    bonjour,

    Une dernière demande, je souhaite ne pas récupérer la première ligne de chaque fichiers, j'ai essayé d'utilisé if (NR!=1) mais il ne met pas la première ligne mais uniquement pour un seul fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     awk '{if(NR>1) {a=FILENAME; gsub("^rep/rep|/.*", "", a); print a, $0}}' rep/file*/file.txt > output.txt

  7. #7
    Membre expert Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    1 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : mars 2009
    Messages : 1 577
    Points : 3 293
    Points
    3 293

    Par défaut

    J'ai glisser une ânerie dans ma première réponse car à chaque ligne la substitution est effectuée, alors qu'il suffit de le faire une seule fois pour chaque première ligne de fichier. Ce qui du même coup répond à ta dernière question vu qu'il faut utiliser la variable FNR (File Number Row) pour connaître la ligne du fichier courant (NR quant à lui donne le nombre total de lignes traitées par awk quelle qu'en soit l'origine). Ce qui nous donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'FNR==1 {a=FILENAME; a=gsub("^.*/rep|/.*", "", a); next} {print a, $0}' rep/rep*/file.txt > output.txt
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    février 2013
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2013
    Messages : 493
    Points : 155
    Points
    155

    Par défaut

    bonjour,
    merci de votre aide.

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

Discussions similaires

  1. Imprimer tous les fichiers avec un mot spécifié dans le nom
    Par cyber-kaiser dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 11/06/2007, 13h35
  2. Ajout d'un contenu dans un textarea
    Par Shenryu dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 25/02/2007, 00h49
  3. Ajouter le mot "annexes" dans la TDM
    Par frodus dans le forum Mise en forme
    Réponses: 5
    Dernier message: 09/11/2006, 16h55
  4. [DEBUTANT]Recherche mot contenu dans une String
    Par lynxman dans le forum Langage
    Réponses: 7
    Dernier message: 16/12/2005, 11h49
  5. mot réservé dans un nom de champ
    Par dreamwanderer dans le forum PHP & MySQL
    Réponses: 5
    Dernier message: 10/12/2005, 20h54

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