Aide pour script shell SVP

Résolu
Bonjour,

j'ai deux fichiers: l'un de 400 lignes, l'autre de 2000 lignes, chacun contenants deux entrées par lignes, ces deux entrées sont séparées par un point-virgule.

Exemple:
2217;2123355600207
2219;CNCT8DPGLN
2221;C2TQ74J
2222;212397120914
2223;72TQ74J
2224;2123971201921
2225;CN-0W024K-74261-8CQ-D7WL
2226;CNDA11125D

Lorsque les deuxièmes entrées de chaque fichier sont les mêmes, je dois recopier la première entrée du deuxième fichier sur la ligne correspondant dans le premier fichier....

J'ai pensé aux commandes grep, puis awk et enfin sed mais ne maîtrisant que très mal les expressions régulières et le commandes unix je viens à vous.

D'avance, merci.

23 réponses

  1. Merci encore pour ton aide car sans toi je n'aurais jamais pu apprendre tout ça.
    1. Modérateur
      En théorie, oui, mais j'avoue que certaines pages de man (ou parties internes) sont parfois assez obscures pour ne pas dire incompréhensibles ;-\
      1. en théorie un manuel c'est fait pour clarifier les interrogations de ceux qui le consulte? non? :)
        1. Modérateur
                 ${paramètre#mot}
                 ${paramètre##mot}
                        Le  mot est développé pour fournir un motif, comme dans l'expan-
                        sion des noms de fichiers. Si le motif correspond au début de la
                        valeur  du  paramètre, alors le développement prend la valeur du
                        paramètre après suppression du  plus  petit  motif  commun  (cas
                        ``#''), ou du plus long motif (cas ``##'').  Si le paramètre est
                        @ ou *, l'opération de suppression  de  motif  est  appliquée  à
                        chaque paramètre positionnel successivement, et le développement
                        donne la liste finale.  Si le paramètre est une variable tableau
                        indexée  par  @  ou  *,  l'opération de suppression de motif est
                        appliquée à chaque  membre  du  tableau  successivement,  et  le
                        développement donne la liste finale.
          
                 ${paramètre%mot}
                 ${paramètre%%mot}
                        est  développé pour fournir un motif, comme dans l'expansion des
                        noms de fichiers. Si le motif correspond à une portion finale de
                        la  valeur  du paramètre, alors le développement prend la valeur
                        du paramètre après suppression du plus petit motif  commun  (cas
                        ``%''), ou du plus long motif (cas ``%%'').  Si le paramètre est
                        @ ou *, l'opération de suppression  de  motif  est  appliquée  à
                        chaque paramètre positionnel successivement, et le développement
                        donne la liste finale.  Si le paramètre est une variable tableau
                        indexée  par  @  ou  *,  l'opération de suppression de motif est
                        appliquée à chaque  membre  du  tableau  successivement,  et  le
                        développement donne la liste finale.
          1. Modérateur
            Dans le "man bash" !

            Si tu as les pages de man en français, tapes :
            man bash -P 'less -p "^   Remplacement des paramètres"'
            ;-))
            1. où puis-je trouver plus d'infos sur ${var%;*} et ${var#*;} car je ne comprends pas la règle de fonctionnement malgré mes tests.... =)
              1. où puis-je trouver plus d'infos sur ${var%;*} et ${var#*;} car je ne comprends pas la règle de fonctionnement malgrès mes tests.... =)
                1. Modérateur
                  Pour comprendre il suffit d'essayer (et de lire man bash) :
                  jp@MDK:~/tmpfs ssh$ var="2219;CNCT8DPGLN"
                  
                  jp@MDK:~/tmpfs ssh$ echo ${var#*;}
                  CNCT8DPGLN
                  
                  jp@MDK:~/tmpfs ssh$ echo ${var%;*}
                  2219
                  
                  jp@MDK:~/tmpfs ssh$
                  Quant à la syntaxe de "sed", en fait ça ne remplace pas la valeur de "$line", enfin si, mais par elle même (&) suivi par la valeur de "${entree%;*}".

                  En fait comme on a déjà préciser le motif "/${line}/", dans la commande de substitution (s) on n'a pas besoin de la répéter et le "s//" est en fait un synonyme de "s/${line}/". Donc tu peux écrire :
                  sed -i "/${line}/ s//& ${entree%;*}/" fic1
                  ou
                  sed -i "/${line}/ s/${line}/& ${entree%;*}/" fic1
                  ;-))
                  1. J'aurais aimé quelques précisions sur le script que tu m'a donné, si tu as du temps, car je ne trouve pas les réponses sur le net...
                    je dois mal chercher mais ça fais longtemps alors je me permet de te demander.

                    dans grep "${line#*;}" que signifie le #*; ???

                    dans sed -i "/${line}/ s//& ${entree%;*}/" fic1 /${line}/ s//& ${entree%;*}/ ça remplace par la valeur de la variable line mais après ???
                    1. Un grand Merci pour ton dévouement

                      Je vais tester sur une station unix et te dirais ce qu'il en ai.
                      Développer sous windows complique encore plus la tâche... j'en ai vraiment marre.
                      1. Modérateur
                        Bon 2 choses :

                        1- La 1ère erreur se situe sur le chemin de l'exécutable, as-tu bien un /bin/sh (ou un lien) ? Si non changes-en pour un chemin pointant vers bash ou sh...

                        2- La permission n'est pas sur tes fichiers, mais sur le fichier temporaire créé par "sed", dans "temp" (ou tmp), c'est là qu'il te faut les permissions (sous Unix normalement c'est bon, mais sous Windows je ne sais pas ;-\
                        1. $ ls -l
                          total 91
                          -rwx------+ 1 moi ???????? 31947 May 18 16:47 FileMaker.csv
                          -rwx------+ 1 moi ???????? 10974 May 18 16:47 GLPI.csv
                          -rwx------+ 1 moi ????????   183 May 19 14:09 Nouveau Docum
                          -rwx------+ 1 moi ???????? 10974 May 18 16:47 fic1.csv
                          -rwx------+ 1 moi ???????? 31947 May 18 16:47 fic2.csv
                          -rwx------+ 1 moi ????????   186 May 19 14:26 script.sh
                          -rwx------+ 1 moi ????????   186 May 19 14:11 script.txt
                          1. Mais tout à fait :)
                            Sous notepad++ le code est celui ci:
                            #! /bin/sh
                            
                            #set -xv
                            
                            while read line
                            do
                            entree=$(grep "${line#*;}" fic2.csv)
                            if [ -n "${entree}" ]
                            then
                            sed -i "/${line}/ s//& ${entree%;*}/" fic1.csv
                            unset entree
                            fi
                            done < fic1.csv
                            


                            C'est exactement le même que tu m'as donné avec l'extension des fichiers rajoutée.

                            j'ai droit à:
                            $ ./script.sh
                            ./script.sh: line 1: $'\357\273\277#!': command not found
                            sed: cannot rename ./sedZbAM2X: Permission denied


                            j'ai vérifié les droits de mes fichiers (clique droit propriété sécurité) j'ai le controle total sur ceux-ci... mes fichiers ne sont pas en lecture seule... :(

                            Merci.
                            1. Quand je converti en DOS to UNIX ça à l'air de marcher... enfin, le script se lance :D tout comme si je le colle directement dans la console.
                              Maintenant je dois avoir un problème de droits car j'ai ceci:

                              sed: cannot rename ./sedkjdtJq: Permission denied
                              sed: cannot rename ./sedijScYK: Permission denied
                              sed: cannot rename ./sedcNfuty: Permission denied
                              sed: cannot rename ./sedycDfX1: Permission denied
                              sed: cannot rename ./sedtvbzI1: Permission denied
                              sed: cannot rename ./sedmrQt7l: Permission denied


                              Je vais reflechir au problème...
                              • 1
                              • 2