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 :

Comment récupérer des valeurs dans un fichier pour effectuer une substitution dans un autre ?


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Comment récupérer des valeurs dans un fichier pour effectuer une substitution dans un autre ?
    Bonjour,

    J'ai besoin d'urgence de substituer dans un fichier des valeurs par d'autres présentes dans un autre fichier et je ne sait pas comment procéder.

    N.B. Les 2 fichiers ont le même nombre de lignes (plusieurs centaines) et le champs1 (ville dans l'exemple) est dans le bon ordre dans le fichier2. Par contre il y a des trous dans la numérotation du fichier 1... Je précise aussi que je ne suis pas en bash 4 mais en 2.05b.0(1)-release

    Exemple du fichier1 (contenant les infos à substituer) :

    ville1 tata ville4 tbtb
    ville3 ville5 tctc tdtd
    ville4 tete ville1 tftf
    ville5 tgtg thth ville3

    Exemple du fichier2 (contenant les noms des villes) :

    Lille
    Paris
    Lyon
    Toulouse

    Il me faut donc au final un fichier3 contenant :

    Lille tata Lyon tbtb
    Paris Toulouse tctc tdtd
    Lyon tete Lille tftf
    Toulouse tgtg thth Paris

    Merci d'avance pour votre aide !

  2. #2
    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
    Salut,

    Une piste, man paste
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci mais en fait j'ai oublié que le champ 1 peut se retrouver à une autre position c'est un peu plus compliqué et ça rend les chose impossibles sans un script contenant un sed je pense...

    Je mets à jour mon post

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

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

    moi, ça 'me plaît pas : je voudrais un véritable extrait du fichier1 (et pourquoi pas du fichier2 aussi); parce que sur deux lignes, on peut percevoir une régularité qui n'existe pas en fait.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Désolé mais je ne peux donner les données réelles des fichiers (données confidentielles). Je rajoute une ligne 3 et 4 pour plus de clarté... j’espère

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Je pense qu'il faut charger la première ligne du fichier2 (Paris), faire un sed avec substitution globale dans le fichier1 pour remplacer tous les ville1 par Paris, ensuite charger la seconde ligne du fichier2 et refaire un sed etc... mais j'ai du mal (je débute en scripting et j'ai du mal à imbriquer 2 boucles)

  7. #7
    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
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    En testant un solution je me suis aperçu qu'il y a des trou dans la numérotation. Désolé mais je ne l'avais pas vu au début. Je modifie à nouveau mon exemple.

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

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

    étant donné que des solutions ont déjà été données sur un autre forum, je crois pouvoir y aller de la mienne ici :
    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
    #!/bin/bash
     
    (( ${BASH_VERSINFO} < 4 )) && {
       echo "La version de BASH disponible sur sur votre système ($BASH_VERSION) ne peut pas exécuter ce script"
       exit
    }
     
    declare -A Villes
     
    exec 3<./fichier1
    exec 4<./fichier2
     
    while read -u3 refVille reste
    do read -u4 nomVille 
       Villes[${refVille}]="$nomVille"
    done
     
    for refVille in "${!Villes[@]}"
    do cmdSed+=( "-e s/$refVille/${Villes[$refVille]}/ig" )
    done
     
    sed -i "${cmdSed[@]}" ./fichier1
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    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
    Salut,

    Ma mienne, même sans bash4

    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
    $ cat fichier1
    ville1 tata ville2 tbtb
    ville2 ville3 tctc tdtd
    ville3 tete ville4 tftf
    Ville4 tgtg thth ville3
     
    $ cat fichier2
    Lille
    Paris
    Lyon
    Toulouse
     
    $ cat foo.sh 
    #! /bin/bash
    #set -xv
     
    i=1
     
    while read line
    do
    valeur=$(sed -n "${i}p" fichier2)
    sed -i "s/${line%% *}/${valeur}/Ig" fichier1
    ((i++))
    done < fichier1
     
    $ ./foo.sh 
     
    $ cat fichier1
    Lille tata Paris tbtb
    Paris Lyon tctc tdtd
    Lyon tete Toulouse tftf
    Toulouse tgtg thth Lyon
     
    $
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    étant donné que des solutions ont déjà été données sur un autre forum, je crois pouvoir y aller de la mienne ici :
    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
    #!/bin/bash
     
    (( ${BASH_VERSINFO} < 4 )) && {
       echo "La version de BASH disponible sur sur votre système ($BASH_VERSION) ne peut pas exécuter ce script"
       exit
    }
     
    declare -A Villes
     
    exec 3<./fichier1
    exec 4<./fichier2
     
    while read -u3 refVille reste
    do read -u4 nomVille 
       Villes[${refVille}]="$nomVille"
    done
     
    for refVille in "${!Villes[@]}"
    do cmdSed+=( "-e s/$refVille/${Villes[$refVille]}/ig" )
    done
     
    sed -i "${cmdSed[@]}" ./fichier1
    Merci beaucoup mais je suis en bash 2.05b.0(1)-release ...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    Citation Envoyé par zipe31
    même sans bash4
    tu remplaces ((i++)), par i=$(($i + 1 )), et même pas besoin de bash !

    bientôt sans les mains ?

    ps: en bash "moderne", i=1 n'est pas nécessaire, il suffit d'incrémenter {codeinline]i[/codeinline] avant dans l'expression sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeur=$(sed -n $((++i))p fichier2)
    i, qui ne vaut rien (0), est incrémenter avant, et donc vaut 1.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    Ma mienne, même sans bash4

    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
    $ cat fichier1
    ville1 tata ville2 tbtb
    ville2 ville3 tctc tdtd
    ville3 tete ville4 tftf
    Ville4 tgtg thth ville3
     
    $ cat fichier2
    Lille
    Paris
    Lyon
    Toulouse
     
    $ cat foo.sh 
    #! /bin/bash
    #set -xv
     
    i=1
     
    while read line
    do
    valeur=$(sed -n "${i}p" fichier2)
    sed -i "s/${line%% *}/${valeur}/Ig" fichier1
    ((i++))
    done < fichier1
     
    $ ./foo.sh 
     
    $ cat fichier1
    Lille tata Paris tbtb
    Paris Lyon tctc tdtd
    Lyon tete Toulouse tftf
    Toulouse tgtg thth Lyon
     
    $
    Ca fonctionne nickel ! Un énorme MERCI !!!

  14. #14
    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
    Citation Envoyé par N_BaH Voir le message
    tu remplaces ((i++)), par i=$(($i + 1 )), et même pas besoin de bash !

    bientôt sans les mains ?


    ps: en bash "moderne", i=1 n'est pas nécessaire, il suffit d'incrémenter i avant dans l'expression sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    valeur=$(sed -n $((++i))p fichier2)
    i, qui ne vaut rien (0), est incrémenter avant, et donc vaut 1.
    Merchi
    $ man woman
    Il n'y a pas de page de manuel pour woman.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/01/2013, 16h39
  2. [XL-2007] Récupération des valeurs d'un fichier pour les copier dans un autre
    Par stelme dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/11/2011, 06h00
  3. Réponses: 4
    Dernier message: 25/01/2010, 16h07
  4. Réponses: 0
    Dernier message: 10/08/2008, 19h05
  5. Réponses: 9
    Dernier message: 05/11/2007, 11h05

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