Concaténation

Résolu
tht123 Messages postés 72 Statut Membre -  
tht123 Messages postés 72 Statut Membre -
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
Configuration: Windows XP
Internet Explorer 6.0

11 réponses

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

    Bonne chance
    0
  2. tht123 Messages postés 72 Statut Membre
     
    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
  3. tht123 Messages postés 72 Statut Membre
     
    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
  4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. tht123 Messages postés 72 Statut Membre
     
    Pour le references, si ça simplifie on peut les avoir dans l'ordre !

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

    Ok?
    0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  8. tht123 Messages postés 72 Statut Membre
     
    Salut,

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

    BAT
    0
  9. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  10. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  11. tht123 Messages postés 72 Statut Membre
     
    YESYESYESYESY

    YOUPIIIIIIIII

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

    Merci encore
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Tu ne te serais pas trompé de post par hasard ??? ;-))
      0
  12. tht123 Messages postés 72 Statut Membre
     
    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