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 13/01/2010, 13h00   #1
Invité régulier
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 7
Points : 7
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 :
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 :
1
2
3
4
/miam/ouh1
/miam/ouh2
/miam/ouh3
etc...
et j'aimerai avoir un fichierMix avec le contenu suivant :

Code :
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

Dernière modification par zorooo ; 13/01/2010 à 13h24.
zorooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2010, 13h50   #2
Membre régulier
 
Homme Boris Pigeot
Administrateur systèmes et réseaux
Inscription : juillet 2008
Messages : 72
Détails du profil
Informations personnelles :
Nom : Homme Boris Pigeot
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 : 94
Points : 94
Ca doit être simplifiable :
Code :
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;
Meskalyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2010, 14h00   #3
Membre habitué
 
Inscription : mai 2007
Messages : 138
Détails du profil
Informations personnelles :
Âge : 59

Informations forums :
Inscription : mai 2007
Messages : 138
Points : 108
Points : 108
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 :
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

Dernière modification par noooop ; 13/01/2010 à 14h39.
noooop est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2010, 14h28   #4
Invité régulier
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 7
Points : 7
je n'ai qu'un mot : merci
zorooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2010, 14h34   #5
Membre régulier
 
Homme Boris Pigeot
Administrateur systèmes et réseaux
Inscription : juillet 2008
Messages : 72
Détails du profil
Informations personnelles :
Nom : Homme Boris Pigeot
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 : 94
Points : 94
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
Meskalyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2010, 14h43   #6
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 897
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 897
Points : 3 677
Points : 3 677
Code :
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_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2010, 16h10   #7
Invité régulier
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 7
Points : 7
comme dab plusieurs façon de faire
faut que je trouve le temps pour etudier les autres histoire de progresser un peu

merci
zorooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2010, 20h16   #8
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
Bonsoir,

J'ai quelque chose qui ressemble à ce qu'a produit N_BaH, sans avoir regardé.
Code :
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).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2010, 22h29   #9
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 897
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 897
Points : 3 677
Points : 3 677
Ou, quelque chose qui ressemble à ce qu'a produit jmelyn. OK, moi, j'ai regardé.
Code :
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 :
paste -d' ' fichierB <(sed 's/^\///' fichierA) > fichierMix
...
?

Dernière modification par N_BaH ; 13/01/2010 à 23h08.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2010, 11h30   #10
Invité régulier
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 7
Points : 7
j'ai étudié vos "choses" j'ai appris pas mal de truc mais :


Code :
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é
zorooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2010, 13h57   #11
Expert Confirmé
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 1 897
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 1 897
Points : 3 677
Points : 3 677
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_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2010, 14h02   #12
Invité régulier
 
Inscription : juin 2008
Messages : 64
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 64
Points : 7
Points : 7
mouhai...
et : <&3 ou <&4 ??
zorooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2010, 14h23   #13
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
Bon, explication de texte:
Le problème ici est que la commande read lit une ligne d'un fichier puis le referme. Donc:
Code :
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).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2010, 00h23   #14
Membre chevronné
 
Inscription : septembre 2007
Messages : 685
Détails du profil
Informations personnelles :
Âge : 48
Localisation : Suisse

Informations forums :
Inscription : septembre 2007
Messages : 685
Points : 723
Points : 723
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 :
sed 's#^/##' file_2 | paste -d ' ' file_1 - > file_out
__________________
Un problème bien posé est déjà résolu (H. Bergson).
jmelyn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2010, 09h17   #15
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 664
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 664
Points : 1 196
Points : 1 196
Avec AWK

Code :
1
2
 
awk '{ getline var < "FichierB" ; gsub("^/","") ; print var,$0 }' FichierA

Dernière modification par becket ; 18/01/2010 à 10h31.
becket est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 04h21.


 
 
 
 
Partenaires

Hébergement Web