Concaténation

Résolu
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. Modérateur
    Personnellement je ne suis pas sûre d'avoir compris ce que tu veux faire, peux-tu donner un exemple ?

    Bonne chance
    0
    1. 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
      1. 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
        1. Modérateur
          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
          1. Pour le references, si ça simplifie on peut les avoir dans l'ordre !

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

            Ok?
            0
            1. Modérateur
              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
              1. Salut,

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

                BAT
                0
                1. Modérateur
                  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
                  1. Modérateur
                    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
                    1. YESYESYESYESY

                      YOUPIIIIIIIII

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

                      Merci encore
                      0
                      1. Modérateur
                        Tu ne te serais pas trompé de post par hasard ??? ;-))
                        0
                    2. 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