Concaténation

Résolu
tht123 Messages postés 72 Date d'inscription   Statut Membre Dernière intervention   -  
tht123 Messages postés 72 Date d'inscription   Statut Membre Dernière intervention   -
Salut,

Pour rassembler des fichiers avec sed :

sed -n p fich1 fich2 > fich3
ou :

sed -n p fich* > fichnew

Mon problème est que lorsque je concatene sed ajoute les lignes et j'en ai certaines qui sont dupliquées. Alors j'utilise sort et uniq qui trient et enlève les doublons.

Or, dans mon cas, fich1 est une mise à jour de fich2 donc il faut que le contenu de fich1 soit ajouté à fich2 en écrassant les lignes existantes. Existe t-il des fonction qui permettent ce genre de manip??

BAV

11 réponses

mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Personnellement je ne suis pas sûre d'avoir compris ce que tu veux faire, peux-tu donner un exemple ?

Bonne chance
0
tht123 Messages postés 72 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour désolé du manque de clareté :

Exemple:

Fich1:

Ref01 1234 7896 9516
Ref02 4564 4475 5787
Ref03 2134 7899 4237

Fich2:

Ref01 1234 7896 9516
Ref03 12374 4447 9999
Ref04 1234 4567 9874

Après concaténation dans Fich :

Ref01 1234 7896 9516
Ref02 4564 4475 5787
Ref03 12374 4447 9999
Ref04 1234 4567 9874

DONC, ici fich2 à mis à jour fich1 en écrassant déjà les données existantes (Refxx). En fait Refxx est le point commun et les valeurs associées changent dans le temps.==> MAJ

Est-ce pluis clair?
0
tht123 Messages postés 72 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour désolé du manque de clareté :

Exemple:

Fich1:

Ref01 1234 7896 9516
Ref02 4564 4475 5787
Ref03 2134 7899 4237

Fich2:

Ref01 1234 7896 9516
Ref03 12374 4447 9999
Ref04 1234 4567 9874

Après concaténation dans Fich :

Ref01 1234 7896 9516
Ref02 4564 4475 5787
Ref03 12374 4447 9999
Ref04 1234 4567 9874

DONC, ici fich2 à mis à jour fich1 en écrassant déjà les données existantes (Refxx). En fait Refxx est le point commun et les valeurs associées changent dans le temps.==> MAJ

Est-ce pluis clair?
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Yep j'ai compris. Autres questions :
- est ce que les références sont forcément triées par ordre croissant dans les fichiers ?
- est ce que tu veux absolument le faire en shell ou on peut utiliser d'autres langages ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tht123 Messages postés 72 Date d'inscription   Statut Membre Dernière intervention  
 
Pour le references, si ça simplifie on peut les avoir dans l'ordre !

Perso, j'aimerai mieu avec awk,sed,, ou grep ...

Ok?
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

vu ton message N° 3 alors tu peux faire comme ça

1. sauvegarde de fichier2
cp fichier2 fichier2.save
2. créer le patch
diff -c fichier2 fichier1 > patch.fic
3. mise à jour de fichier2
patch < patch.fic
et le fichier2 sera à jour
0
tht123 Messages postés 72 Date d'inscription   Statut Membre Dernière intervention  
 
Salut,

est tu sur de la dernière ligne car patch n'est pas un executable dans cygwin!?!

BAT
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Je suis très sûr puisque j'ai testé sur debian, voilà pourquoi il faut préciser la configuration :-))

affiche le résultat de la commande
whereis patch
--
lami20j
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Salut,

Voilà une solution avec "sed, grep, sort et uniq".

Seule contrainte il faut que le champ de référence soit toujours égal en longueur (au pire on pourra toujours essayer de l'adapter à ton cas).

Autre contrainte, ça marche dans un environnement GNU/Linux, si tu as des difficultés à le faire exécuter sous Cygwin, il va falloir grandement penser à migrer au plus vite sous le pingouin, d'autant plus que tu t'obstines à te servir de commandes GNU/Linux, donc pourquoi ne pas faire le grand saut, et au cas où ce ne te serait pas possible, essayer d'adopter un pingouin ne serait-ce que dans une machine virtuelle... à méditer, non ?

Bon le script :
[jp@MDK tmpfs]$ cat Fich1

Ref01 1234 7896 9516
Ref02 4564 4475 5787
Ref03 2134 7899 4237

[jp@MDK tmpfs]$ cat Fich2

Ref01 1234 7896 9516
Ref03 12374 4447 9999
Ref04 1234 4567 9874

[jp@MDK tmpfs]$ cat foo.sh

#! /bin/bash

sed -n '/^$/!p' Fich1 Fich2 | sort | uniq > Fich

while read line
do
ref=$(cut -d " " -f1 <<<"$line")
var=$(grep "$ref" Fich1)
sed -i '/'"$var"'/d' Fich
done < <(sed -n '/^$/!p' Fich1 Fich2 | sort | uniq | uniq -w6 -d)

[jp@MDK tmpfs]$ ./foo.sh

[jp@MDK tmpfs]$ cat Fich

Ref01 1234 7896 9516
Ref02 4564 4475 5787
Ref03 12374 4447 9999
Ref04 1234 4567 9874

[jp@MDK tmpfs]$ 
;-))
0
tht123 Messages postés 72 Date d'inscription   Statut Membre Dernière intervention  
 
YESYESYESYESY

YOUPIIIIIIIII

Là tu fais fort, il sagisait bien du caratère de fin de ligne!

Merci encore
0
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 896
 
Tu ne te serais pas trompé de post par hasard ??? ;-))
0
tht123 Messages postés 72 Date d'inscription   Statut Membre Dernière intervention  
 
NON!

Je viens de revérifier et j'ai bien mont fichier concaténé!

Ref01 1234 7896 9516

Ref02 4564 4475 5787

Ref03 12374 4447 9999

Ref04 1234 4567 9874

BAT t'as une idée pour l'autre post?
0