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 :

copie contenu d'un fichier dans un autre fichier avec sed


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    Points : 29
    Points
    29
    Par défaut copie contenu d'un fichier dans un autre fichier avec sed
    Bonjour à tous,

    Alors voila mon petit problème, simple pour certain d'entre vous je pense

    j'ai une liste de fichier dans un fichierA :
    genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /fichier/blabla1
    /fichier/blabla2
    /fichier/blabla3
    etc...
    et j'aimerai inserer sont contenu dans un autre fichier en tant que deuxième colonne mais en la modifiant un peu

    contenu fichierB :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /miam/ouh1
    /miam/ouh2
    /miam/ouh3
    etc...
    et j'aimerai avoir un fichierMix avec le contenu suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    /miam/ouh1 fichier/blabla1
    /miam/ouh2 fichier/blabla2
    /miam/ouh3 fichier/blabla1
    enlever le / de chaque ligne du fichierA avant de l'inserer dans le fichierB
    je sais faire mais inserer le fichierA comme deuxieme colonne du fichierB...

    une idée ?

    merci d'avance

  2. #2
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2008
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2008
    Messages : 72
    Points : 102
    Points
    102
    Par défaut
    Ca doit être simplifiable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
    f1=test1
    f2=test2
    final=test3
    numline=`cat $f1 | wc -l`
    for i in $(seq $numline);
    do
            pre='p'
            var=$i$pre
            finalvar1=`cat $f1 | sed -n $var`
            finalvar2=`cat $f2 | sed -n $var`
            echo $finalvar1 $finalvar2 >> $final
    done;

  3. #3
    Membre actif
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Points : 289
    Points
    289
    Par défaut
    Si tes deux fichiers ont le même nombre de ligne,

    lire chaque ligne des deux fichiers dans deux variables séparées col1 et col2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    tant que pas fini
    faire
            lire col1 depuis fichier1
            lire col2 depuis fichier2
            col2=`echo "$col2" | sed "s/^\///"`
            echo "$col1 $col2 >> fic.temp
    fait
     
    cp fic.temp monfichierdefinitif

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    Points : 29
    Points
    29
    Par défaut
    je n'ai qu'un mot : merci

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2008
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2008
    Messages : 72
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par zorooo Voir le message
    je n'ai qu'un mot : merci
    Bon, dans ce cas là, si j'ai bien suivi mes cours, il faut mettre résolu

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    exec 3<fichierA
    exec 4<fichierB
    while read colA 0<&3
     do
       read colB 0<&4
       echo "$colB ${colA#/*}"
    done
    /miam/ouh1 fichier/blabla1
    /miam/ouh2 fichier/blabla2
    /miam/ouh3 fichier/blabla3
    et p'i c'est tout !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    Points : 29
    Points
    29
    Par défaut
    comme dab plusieurs façon de faire
    faut que je trouve le temps pour etudier les autres histoire de progresser un peu

    merci

  8. #8
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bonsoir,

    J'ai quelque chose qui ressemble à ce qu'a produit N_BaH, sans avoir regardé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    exec 3< file_1
    exec 4< file_2
    > file_out
     
    while [ 1 ]
    do
      read line_1 <&3 && read line_2 <&4 && echo "$line_1 ${line_2#/}" >> file_out || break
    done
    Un problème bien posé est déjà résolu (H. Bergson).

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Ou, quelque chose qui ressemble à ce qu'a produit jmelyn. OK, moi, j'ai regardé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    maFunc(){
    read colA 0<&3 && read colB 0<&4 && echo "$colB ${colA#/}" || exit
    maFunc
    }
    exec 3<fichierA
    exec 4<fichierB
    maFunc > file_out
    exit dans un script
    return dans une console

    et pourquoi pas simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    paste -d' ' fichierB <(sed 's/^\///' fichierA) > fichierMix
    ...
    ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    Points : 29
    Points
    29
    Par défaut
    j'ai étudié vos "choses" j'ai appris pas mal de truc mais :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    exec 3< file_1
    exec 4< file_2
    > file_out
     
    while [ 1 ]
    do
      read line_1 <&3 && read line_2 <&4 && echo "$line_1 ${line_2#/}" >> file_out || break
    done
    a base exec et read j'ai rien panné

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour zorooo,

    exec [n]<file
    exec effectue une redirection d'un fichier vers un descripteur de fichier supplémentaire (ou n est un nombre au-delà de la sortie d'erreur standard (2)).
    (voir Dédoublement de descripteur de fichier)

    on aurait pu simplifier les read par read -u [numéro du descripteur de fichier]
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 65
    Points : 29
    Points
    29
    Par défaut
    mouhai...
    et : <&3 ou <&4 ??

  13. #13
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bon, explication de texte:
    Le problème ici est que la commande read lit une ligne d'un fichier puis le referme. Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    read var < file_in; echo $var   --> ligne_1, c'est normal
    read var < file_in; echo $var   --> ligne_1, encore! ZUT!
    affichera deux fois la première ligne du fichier file_in. Il faut donc un truc pour garder le fichier ouvert, ainsi toutes les lignes seront lues l'une après l'autre. Pour ce faire, on ouvre le fichier et on garde la main dessus grâce au file descriptor. C'est ce que fait la commande Pourquoi 3? Parce que par défaut, 0 est l'entrée standard, 1 la sortie standard et 2 la sortie erreur standard. Mais j'aurais pu prendre 18, par exemple.

    Ensuite, dans la boucle: lit une ligne du file descriptor 3 (c'est-à-dire le fichier file_1) et la met dans la variable $ligne_1. Si tout va bien (le retour de read vaut alors zéro), la commande suivante est exécutée: lecture d'une ligne de l'autre fichier. Si tout va toujours bien (le second read renvoie aussi zéro), la commande suivante est exécutée: c'est l'envoi de la ligne du fichier 1 avec la ligne du fichier 2 sans le '/' du début vers le fichier file_out. Si quelque chose s'est mal passé, c'est la dernière partie qui est exécutée: break qui sort de la boucle infinie (while [ 1 ]). Les liens entre ces commandes sont && et ||, une sorte de si - alors - sinon. Voir le manuel de Bash pour plus de précisions.

    Il y a, je crois, quelques approximations dans la logique: je n'ai pas testé si le fichier 1 a moins de lignes que le fichier 2, je n'ai pas testé le contraire non plus. À voir...
    Un problème bien posé est déjà résolu (H. Bergson).

  14. #14
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Bonsoir,

    Je trouve néanmoins que la solution de N_BaH est la plus concise et la plus élégante. Je la modifirais juste un peu comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's#^/##' file_2 | paste -d ' ' file_1 - > file_out
    Un problème bien posé est déjà résolu (H. Bergson).

  15. #15
    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 '{ getline var < "FichierB" ; gsub("^/","") ; print var,$0 }' FichierA

Discussions similaires

  1. Copier contenu d'une feuille dans un autre fichier
    Par neo2k2 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/10/2007, 18h01
  2. Réponses: 4
    Dernier message: 28/08/2007, 17h11
  3. Réponses: 1
    Dernier message: 15/05/2007, 16h55
  4. vba copie contenu d'un champs dans un autre
    Par juju124 dans le forum VBA Access
    Réponses: 1
    Dernier message: 02/05/2007, 17h15
  5. Réponses: 13
    Dernier message: 27/10/2006, 11h50

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