Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/11/2011, 20h52   #1
Invité de passage
 
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 1
Points : 1
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 !
fredlabid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 20h59   #2
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Une piste, man paste
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/11/2011, 21h08   #3
Invité de passage
 
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 1
Points : 1
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
fredlabid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 21h51   #4
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
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_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 21h57   #5
Invité de passage
 
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 1
Points : 1
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
fredlabid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 22h12   #6
Invité de passage
 
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 1
Points : 1
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)
fredlabid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 22h35   #7
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Comment lire/parcourir un fichier ?
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/11/2011, 23h20   #8
Invité de passage
 
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 1
Points : 1
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.
fredlabid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 10h37   #9
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
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 :
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_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/11/2011, 11h16   #10
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Ma mienne, même sans bash4

Code :
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.
zipe31 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/11/2011, 11h20   #11
Invité de passage
 
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 1
Points : 1
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 :
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 ...
fredlabid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 11h58   #12
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
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 :
valeur=$(sed -n $((++i))p fichier2)
i, qui ne vaut rien (0), est incrémenter avant, et donc vaut 1.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/11/2011, 12h00   #13
Invité de passage
 
Inscription : novembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2011
Messages : 7
Points : 1
Points : 1
Citation:
Envoyé par zipe31 Voir le message
Salut,

Ma mienne, même sans bash4

Code :
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 !!!
fredlabid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 12h06   #14
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
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 ?


Citation:
ps: en bash "moderne", i=1 n'est pas nécessaire, il suffit d'incrémenter i avant dans l'expression sed :
Code :
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.
zipe31 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h21.


 
 
 
 
Partenaires

Hébergement Web