Aide pour script shell SVP
Résolu
diaboly
Messages postés
82
Statut
Membre
-
diaboly Messages postés 82 Statut Membre -
diaboly Messages postés 82 Statut Membre -
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.
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:
- Aide pour script shell SVP
- Classic shell - Télécharger - Personnalisation
- Script vidéo youtube - Guide
- Ghost script - Télécharger - Polices de caractères
- Mas script - Accueil - Windows
- Script cmd - Guide
23 réponses
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 ;-\
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;-))
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....
Merci de m'avoir consacré du temps, je galère encore dessus depuis hier apres-midi....
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:
J'ai donc supprimé les deux sauts de ligne, réduisant le nombre d'erreurs:
j'ai aussi testé sans rien toucher au script(en laissant sans extensions) rien ne change.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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) )
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) )
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:
Je vais reflechir au problème...
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...
Mais tout à fait :)
Sous notepad++ le code est celui ci:
C'est exactement le même que tu m'as donné avec l'extension des fichiers rajoutée.
j'ai droit à:
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.
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.
$ 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
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- 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 ;-\
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.
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.
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 ???
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 ???
Pour comprendre il suffit d'essayer (et de lire man bash) :
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 :
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;-))
où puis-je trouver plus d'infos sur ${var%;*} et ${var#*;} car je ne comprends pas la règle de fonctionnement malgré mes tests.... =)
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.... =)
Dans le "man bash" !
Si tu as les pages de man en français, tapes :
Si tu as les pages de man en français, tapes :
man bash -P 'less -p "^ Remplacement des paramètres"';-))
${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.