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. 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
    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. 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. 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. Salut,

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

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

                      Bonne chance
                      0