Aide pour script shell SVP

Résolu/Fermé
diaboly Messages postés 79 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 10 février 2012 - 19 mai 2009 à 08:47
diaboly Messages postés 79 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 10 février 2012 - 20 mai 2009 à 11:30
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.
A voir également:

23 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
20 mai 2009 à 09:49
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
19 mai 2009 à 10:10
Salut,
#! /bin/sh

#set -xv

while read line
do
entree=$(grep "${line#*;}" fic2)
if [ -n "${entree}" ]
then
sed -i "/${line}/ s//& ${entree%;*}/" fic1
unset entree
fi
done < fic1
;-))
0
diaboly Messages postés 79 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 10 février 2012 22
19 mai 2009 à 11:36
Woah! merci pour ta réponse on ne peux plus précise, je vais tester ça.
Merci de m'avoir consacré du temps, je galère encore dessus depuis hier apres-midi....
0
diaboly Messages postés 79 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 10 février 2012 22
19 mai 2009 à 11:57
Bon j'ai encore quelques petits soucis... ( je suis sous cygwin ce qui ne doit pas arranger les choses)
j'ai modifié les extensions de fichiers pour coller a mon cas.
lorsque je copie colle exactement le script donné plus haut j'ai ce message d'erreur:
$ ./script.sh
./script.sh: line 2: $'\r': command not found
./script.sh: line 4: $'\r': command not found
./script.sh: line 13: syntax error near unexpected token `done'
./script.sh: line 13: `done < fic1.csv'


J'ai donc supprimé les deux sauts de ligne, réduisant le nombre d'erreurs:
$ ./script.sh
./script.sh: line 11: syntax error near unexpected token `done'
./script.sh: line 11: `done < fic1.csv'


j'ai aussi testé sans rien toucher au script(en laissant sans extensions) rien ne change.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
19 mai 2009 à 12:23
je suis sous cygwin ce qui ne doit pas arranger les choses
Grrrrrrrrrrrrrrrrrrrrrrrr ;-(

Essaie de changer les fins de lignes, avec unix2dos si installé, ou avec "sed" (voir dans la FAQ Sed - Conversion retours chariots DOS (CRLF) / UNIX (LF) )
0
diaboly Messages postés 79 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 10 février 2012 22
19 mai 2009 à 13:41
Encore merci pour ton aide :)
je teste ça.
0
diaboly Messages postés 79 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 10 février 2012 22
19 mai 2009 à 14:13
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...
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 897
19 mai 2009 à 14:18
On peut voir la tronche de ton script ?
0
diaboly Messages postés 79 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 10 février 2012 22
19 mai 2009 à 14:24
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.
0
diaboly Messages postés 79 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 10 février 2012 22
19 mai 2009 à 14:40
mon problème doit s'apeller windows XP ^^
0
diaboly Messages postés 79 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 10 février 2012 22
19 mai 2009 à 14:45
$ 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
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 897
19 mai 2009 à 14:58
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 ;-\
0
diaboly Messages postés 79 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 10 février 2012 22
19 mai 2009 à 15:11
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.
0
diaboly Messages postés 79 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 10 février 2012 22
19 mai 2009 à 15:37
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 ???
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 897
19 mai 2009 à 15:47
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
;-))
0
diaboly Messages postés 79 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 10 février 2012 22
19 mai 2009 à 16:11
Mille Merci Ô grand Dieu d'Unix
0
diaboly Messages postés 79 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 10 février 2012 22
20 mai 2009 à 08:33
où puis-je trouver plus d'infos sur ${var%;*} et ${var#*;} car je ne comprends pas la règle de fonctionnement malgré mes tests.... =)
0
diaboly Messages postés 79 Date d'inscription dimanche 21 novembre 2004 Statut Membre Dernière intervention 10 février 2012 22
20 mai 2009 à 08:33
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.... =)
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 897
20 mai 2009 à 08:39
Dans le "man bash" !

Si tu as les pages de man en français, tapes :
man bash -P 'less -p "^   Remplacement des paramètres"'
;-))
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 897
20 mai 2009 à 08:44
       ${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.
0