Concaténation

Résolu/Fermé
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009 - 30 mai 2007 à 22:43
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009 - 31 mai 2007 à 20:40
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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
31 mai 2007 à 01:29
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 mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
31 mai 2007 à 08:25
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 mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
31 mai 2007 à 09:01
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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
31 mai 2007 à 09:52
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 mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
31 mai 2007 à 10:03
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
31 mai 2007 à 11:31
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 mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
31 mai 2007 à 13:22
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
31 mai 2007 à 14:54
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
31 mai 2007 à 16:04
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 mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
31 mai 2007 à 19:23
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 jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
31 mai 2007 à 19:30
Tu ne te serais pas trompé de post par hasard ??? ;-))
0
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
31 mai 2007 à 20:40
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