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 04/01/2011, 19h06   #1
Membre du Club
 
Inscription : août 2009
Messages : 65
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 65
Points : 44
Points : 44
Par défaut Concaténer deux fichiers

Bonsoir,

Je vous présente mes meilleurs vœux pour cette nouvelle année.
Je commence cette nouvelle année avec un problème à résoudre :

J'ai deux fichiers :
Code :
1
2
3
4
fic1 contient
AAAAA
BBBBBB
CCCCC
Code :
1
2
3
4
fic2 contient
EEEEE
FFFFF
GGGGG
J'espère que vous n'allez pas trouver ma demande stupide. Je cherche à obtenir un troisième fichier qui sera :

Code :
1
2
3
AAAAAEEEEE
BBBBBBFFFFF
CCCCCGGGGG
In fine, un fichier qui prendra le premier enregistrement de fic1 et le compète avec le premier enregistrement de fic2 et ainsi de suite.

J'ai essayé de le faire en ksh avec deux boucles while mais j'obtiens des doublons.

Merci infiniment pour votre aide.
emmachane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 19h27   #2
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 974
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 974
Points : 5 958
Points : 5 958
Salut.

Une méthode barbare mais efficace : tu stocke chaque ligne consécutive dans deux tableaux respectifs (bash gère les tableaux) et dans une troisième boucle qui parcours les tableaux, tu fais quelque chose comme :

Code :
echo ${tab1[$i]}${tab2[$i]} >> fichier_sortie
Sinon tu peut regarder si la commande cat permet de faire cela (je n'en suis pas sûr).

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 21h50   #3
Membre du Club
 
Inscription : août 2009
Messages : 65
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 65
Points : 44
Points : 44
Par défaut Complément

Au fait, pour être plus précis, je pars d'un fichier qui ressemble à (ça commence toujours pareil) :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
A LIGNE01
B LIGNE02
B LIGNE03
B LIGNE04
B LIGNE05
C LIGNE06
A LIGNE07
B LIGNE08
B LIGNE09
B LIGNE10
B LIGNE11
C LIGNE12
Une entête qui débute avec A, un milieu qui démarre toujours avec B et une fin avec C

A partir de ce fichier, je dois avoir deux fichiers :

fic1
Code :
1
2
3
 
A LIGNE01C LIGNE06
A LIGNE07C LIGNE12
fic2
Code :
1
2
3
4
5
6
7
8
9
 
B LIGNE02
B LIGNE03
B LIGNE04
B LIGNE05
B LIGNE08
B LIGNE09
B LIGNE10
B LIGNE11
Je pense que le fait de préciser que le fichier commence par telle ou telle lettre, cela peut à mon avis aider.

Merci
emmachane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 22h57   #4
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 065
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 065
Points : 4 126
Points : 4 126
Bonjour emmachane,

ce n'est plus exactement la même question que dans le premier message :/

en bash :
tu lis le fichier avec une boucle while, et à l'intérieur de la boucle, tu évalues avec un case ...esac, ce par quoi commence la ligne : si la ligne commence par A, tu la gardes dans une variable, si elle commence par B tu la rediriges vers fic2, enfin, si la ligne commence par C tu envoies la variable de la ligneA avec la ligne C vers fic1
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/01/2011, 21h56   #5
Membre du Club
 
Inscription : août 2009
Messages : 65
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 65
Points : 44
Points : 44
La méthode proposée par N_BaH fonctionne parfaitement.
Faire le lien avec mon poste sur la commande while pour éviter la suppression des espaces entre champs.

Merci encore.
emmachane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 16h48   #6
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 944
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 944
Points : 1 080
Points : 1 080
Code :
1
2
3
4
grep '^B' fic > fic2
grep '^A' fic > fic_tmp
grep '^C' fic | paste -d \\0 fic_tmp - > fic2
rm -f fic_tmp
Sous zsh, c'est encore plus simple :
Code :
1
2
grep '^B' fic > fic2
paste -d \\0 =(grep '^A' fic) =(grep '^C' fic) > fic1
LLB est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/01/2011, 17h18   #7
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 065
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 065
Points : 4 126
Points : 4 126
c'est également possible avec bash :
Code :
1
2
grep '^B' fic > fic2
paste -d'\0' <(grep '^A' fic) <(grep '^C' fic) > fic1
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h06.


 
 
 
 
Partenaires

Hébergement Web