Aller au contenu

[RESOLU]Ecriture d'une macro


Scaramouche

Messages recommandés

Amis pingouins bonsoir,

dans le cadre du boulot je me retrouve à faire un travail fastidieux sous linux pour traiter des données expérimentales avant analyse. et je me demandais si une macro pourrait résoudre mes malheurs (on en fait déjà des petites pour se simplifier certaines taches mais je ne sais pas si celle que j'envisage est possible).

je m'explique : les données que l'on récupère proviennent de neufs détecteurs, numérotés de 0 à 8 (ça a son importance) et sont stockées dans un fichier que nous nommerons par la suite expname.dat. Plusieures acquisions peuvent êtres mises à la suite les unes des autres dans le même fichier, chacune constituant ce que j'appelerais plus tard un scan. Un programme, répondant au doux nom de id31sum, est mis à notre disposition pour compiler les données enregistrées par tous les détecteurs, et entre tous les scans. On obtient en sortie deux fichiers de données que je normerais par la suite expname.gsa et expname.epf .

Pour le lancer ce pogramme je dois donc taper une bête ligne de commande commençant par le nom du programme et celui du fichier (logique jusque là)et incluant un certain nombre de paramètres : le binning (cherchez pas ce que c'est mais c'est utile) , le premier scan et le dernier scan à prendre en compte et finalement les détecteurs à exclure de la compilation (utile quand certains merdent).

Or, là où les Dieux de la science sont cruels, c'est que pour ce que j'ai à faire on veut les données scan par scan et détecteur par détecteur ... ce qui nous amène donc à écrire une ligne de commande comme la suivante, dans le cas d'un compilation du premier scan pour le détecteur 0 :

id31sum expname.dat 0.002 1 1 ed=1,2,3,4,5,6,7,8 gsas

Ensuite je dois renommer les deux fichiers que j'ai obtenu en ajoutant au nom les caractéristiques de scan et du détecteur ... rien de très compliqué :

mv expname.gsa expname002_S1_D0.gsa
mv expname.epf expname002_S1_D0.epf

le problème est que je vais me retrouver ce week-end à faire ça pour 150 scans ce qui donne environ 4000 lignes de commandes (je ne les re-tappent pas en entier mais bon... :fumer: )... je l'ai déjà fait une fois et ça m'avait demandé 2 jours sans compter que j'ai quasiment eu des ampoules aux doigts :yes: ... et j'aurai à le refaire à l'avenir....

donc (on arrive enfin au coeur du sujet) est-ce que je ne pourrais pas écrire une petite macro qui me demanderait en entrée au minimum le nom du fichier expname.dat, le nom du scan à traiter et me ferait automatiquement le lancement du programme + le renommage des deux fichier et ceux pour tous les détecteurs par un système de boucle avec compteur.... (et le café aussi vu que je serai quand même un peu crevée ;) )

c'est possible ou alors est-ce que je rêve... :yes:

j'ai posté ici mais ce sujet à peut-être plus sa place dans le forum programmation... en fait je n'en sais rien mais vu que je pensais à une macro.. c'était linux pour moi. s'il faut faire un programme pour arriver à mes fins je ne suis pas du tout compétente donc a priori je ne pencherai pas là-dessus.

dernière précision (je ne sais pas si ça a son importance) : on bosse sur une bonne vieille Suse 7.2 (je peux vous retrouver le kernel si besoin est.. j'ai oublié) et là j'aurai accès à distance au réseau sur lequel je vais travailler (ne me demandez pas comment, tout ce que je sais c'est une histoire de ssh... )

merci d'avance pour votre aide, en espérant que vous n'avez pas trop mal au crâne suite à la lecture de ce post :top:

P.S. : s'i vous plait n'oubliez pas que mon niveau linux est assez (voire très :fumer:) bas donc merci d'avance de vulgariser au maximum :chinois:

Lien vers le commentaire
Partager sur d’autres sites

:coucou: Mlle Scara. C'est tout a fait possible, et si demain personne n'a formuler de ptite manip avec le shell, je te le ferai en perl et je t'enverrai le programme, mais ce soir je doute d'avoir le temps, j'ai du monde... :yes:

J4ai ptet 2 minutes pour y regarder. Est ce que ton nombres d'arguments est variables stp ?

( ps ca serait mieux en prog, je t'envoie la bas )

Lien vers le commentaire
Partager sur d’autres sites

De linux a logiciel, tout le monde sait que linux est mon ami. Et demain il t'ecrira en personne le script :yes:

Ce que j'appelle le nombre d'argument variable, c'est ca :

id31sum expname.dat 0.002 1 1 ed=1,2,3,4,5,6,7,8 gsas

id31sum expname.dat 0.002 1 1 ed=1,2 gsas

id31sum expname.dat 0.002 1 1 ed=1,2,3,4,5 gsas

Mais je viens d'y repenser , oublies ce que je t'ai dit, je ferais une fonction aux nombres d'arguments variables de toutes façons, ca sera plus "professionnel". Après tout, linux est mon ami, enfin, la c'est le C, mais comme j'en manie à longueur de journée et que mon ami n'est que C... :transpi:

Lien vers le commentaire
Partager sur d’autres sites

euh... je comprend pas tout mais effectivement le nombre d'argument peut varier (de 1 a 8 (on ne va pas exclure tous les détecteurs :transpi: ) ) mais dans ce cas précis je voudrais qu'il me passe tous les détecteurs les uns après les autres, ne faisant le "renommage" des fichiers automatiquement

ça me fait penser à un autre script qui pourrait être sympa (:yes:) dans lequel en entrée je lui donne le nom du fichier, le binning, scan initial, le scan final et les détecteurs à exclure (dont le nombre peut varier de 0 à :byebye:... et qui me ferait la compile scan par scan (en associant ensemble tous les détecteurs non exclus donc)... mais c'est une autre histoire, le travail étant moins fastidieux dans ce cas....

edit : je raconte des conneries pour le second script... il existe déjà et s'appelle id31sumall... j'ai la mémoire un peu courte... le truc chiant c'est qu'il nous sort des noms de fichiers pas pratiques et on renomme tout à la main...

bon, je vais aller me coucher je crois, ça évitera que je raconte d'autres bêtises....

Lien vers le commentaire
Partager sur d’autres sites

Essai :

#! /bin/sh


# Date          : 21/12/2004
# Author        : theocrite
# Version       : 0.5
# Description   : simplifier la vie de Scaralamouche
# Licence       : Under GNU General Public Licence (see http://www.gnu.org/copyleft/gpl.html)


NAME=id31sumdbdsbs

# 4 arguments minimum
if [ -z $4 ]
then
  echo "Usage : $NAME.sh binning filename scan_start sca_end"
  exit;
fi

binning=$1
filename=$2
scan_start=$3
scan_end=$4

xcludeddetectors[0]=1,2,3,4,5,6,7,8
xcludeddetectors[1]=0,2,3,4,5,6,7,8
xcludeddetectors[2]=0,1,3,4,5,6,7,8
xcludeddetectors[3]=0,1,2,4,5,6,7,8
xcludeddetectors[4]=0,1,2,3,5,6,7,8
xcludeddetectors[5]=0,1,2,3,4,6,7,8
xcludeddetectors[6]=0,1,2,3,4,5,7,8
xcludeddetectors[7]=0,1,2,3,4,5,6,8
xcludeddetectors[8]=0,1,2,3,4,5,6,7

for detector in `seq 0 8`; do
   for scan_num in `seq $scan_start $scan_end`; do
       id31sum $filename.dat $binning $scan_num $scan_num ed=${xcludeddetectors[$detector]} gsas
       mv $filename.gsa $NAME$(echo $binning | tr -d .)_S$scan_num``_D$detector.gsa
       mv $filename.epf $NAME$(echo $binning | tr -d .)_S$scan_num``_D$detector.epf
   done;
done;
~
~
~

Tu copies ça dans un fichier nommé id31sumdbdsbs.sh dans un répertoire dédié, tu n'oublies pas de te donner les droits d'éxécution (chmod +x id31sumdbdsbs.sh) et tu le lances.

Ce qui donne pour

./id31sumdbdsbs  0.02 supernom 5 9

id31sum supernom.dat 0.02 5 5 ed=1,2,3,4,5,6,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S5_D0.gsa
mv supernom.epf id31sumdbdsbs002_S5_D0.epf
id31sum supernom.dat 0.02 6 6 ed=1,2,3,4,5,6,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S6_D0.gsa
mv supernom.epf id31sumdbdsbs002_S6_D0.epf
id31sum supernom.dat 0.02 7 7 ed=1,2,3,4,5,6,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S7_D0.gsa
mv supernom.epf id31sumdbdsbs002_S7_D0.epf
id31sum supernom.dat 0.02 8 8 ed=1,2,3,4,5,6,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S8_D0.gsa
mv supernom.epf id31sumdbdsbs002_S8_D0.epf
id31sum supernom.dat 0.02 9 9 ed=1,2,3,4,5,6,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S9_D0.gsa
mv supernom.epf id31sumdbdsbs002_S9_D0.epf
id31sum supernom.dat 0.02 5 5 ed=0,2,3,4,5,6,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S5_D1.gsa
mv supernom.epf id31sumdbdsbs002_S5_D1.epf
id31sum supernom.dat 0.02 6 6 ed=0,2,3,4,5,6,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S6_D1.gsa
mv supernom.epf id31sumdbdsbs002_S6_D1.epf
id31sum supernom.dat 0.02 7 7 ed=0,2,3,4,5,6,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S7_D1.gsa
mv supernom.epf id31sumdbdsbs002_S7_D1.epf
id31sum supernom.dat 0.02 8 8 ed=0,2,3,4,5,6,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S8_D1.gsa
mv supernom.epf id31sumdbdsbs002_S8_D1.epf
id31sum supernom.dat 0.02 9 9 ed=0,2,3,4,5,6,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S9_D1.gsa
mv supernom.epf id31sumdbdsbs002_S9_D1.epf
id31sum supernom.dat 0.02 5 5 ed=0,1,3,4,5,6,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S5_D2.gsa
mv supernom.epf id31sumdbdsbs002_S5_D2.epf
id31sum supernom.dat 0.02 6 6 ed=0,1,3,4,5,6,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S6_D2.gsa
mv supernom.epf id31sumdbdsbs002_S6_D2.epf
id31sum supernom.dat 0.02 7 7 ed=0,1,3,4,5,6,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S7_D2.gsa
mv supernom.epf id31sumdbdsbs002_S7_D2.epf
id31sum supernom.dat 0.02 8 8 ed=0,1,3,4,5,6,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S8_D2.gsa
mv supernom.epf id31sumdbdsbs002_S8_D2.epf
[...]
id31sum supernom.dat 0.02 6 6 ed=0,1,2,3,4,5,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S6_D6.gsa
mv supernom.epf id31sumdbdsbs002_S6_D6.epf
id31sum supernom.dat 0.02 7 7 ed=0,1,2,3,4,5,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S7_D6.gsa
mv supernom.epf id31sumdbdsbs002_S7_D6.epf
id31sum supernom.dat 0.02 8 8 ed=0,1,2,3,4,5,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S8_D6.gsa
mv supernom.epf id31sumdbdsbs002_S8_D6.epf
id31sum supernom.dat 0.02 9 9 ed=0,1,2,3,4,5,7,8 gsas
mv supernom.gsa id31sumdbdsbs002_S9_D6.gsa
mv supernom.epf id31sumdbdsbs002_S9_D6.epf
id31sum supernom.dat 0.02 5 5 ed=0,1,2,3,4,5,6,8 gsas
mv supernom.gsa id31sumdbdsbs002_S5_D7.gsa
mv supernom.epf id31sumdbdsbs002_S5_D7.epf
id31sum supernom.dat 0.02 6 6 ed=0,1,2,3,4,5,6,8 gsas
mv supernom.gsa id31sumdbdsbs002_S6_D7.gsa
mv supernom.epf id31sumdbdsbs002_S6_D7.epf
id31sum supernom.dat 0.02 7 7 ed=0,1,2,3,4,5,6,8 gsas
mv supernom.gsa id31sumdbdsbs002_S7_D7.gsa
mv supernom.epf id31sumdbdsbs002_S7_D7.epf
id31sum supernom.dat 0.02 8 8 ed=0,1,2,3,4,5,6,8 gsas
mv supernom.gsa id31sumdbdsbs002_S8_D7.gsa
mv supernom.epf id31sumdbdsbs002_S8_D7.epf
id31sum supernom.dat 0.02 9 9 ed=0,1,2,3,4,5,6,8 gsas
mv supernom.gsa id31sumdbdsbs002_S9_D7.gsa
mv supernom.epf id31sumdbdsbs002_S9_D7.epf
id31sum supernom.dat 0.02 5 5 ed=0,1,2,3,4,5,6,7 gsas
mv supernom.gsa id31sumdbdsbs002_S5_D8.gsa
mv supernom.epf id31sumdbdsbs002_S5_D8.epf
id31sum supernom.dat 0.02 6 6 ed=0,1,2,3,4,5,6,7 gsas
mv supernom.gsa id31sumdbdsbs002_S6_D8.gsa
mv supernom.epf id31sumdbdsbs002_S6_D8.epf
id31sum supernom.dat 0.02 7 7 ed=0,1,2,3,4,5,6,7 gsas
mv supernom.gsa id31sumdbdsbs002_S7_D8.gsa
mv supernom.epf id31sumdbdsbs002_S7_D8.epf
id31sum supernom.dat 0.02 8 8 ed=0,1,2,3,4,5,6,7 gsas
mv supernom.gsa id31sumdbdsbs002_S8_D8.gsa
mv supernom.epf id31sumdbdsbs002_S8_D8.epf
id31sum supernom.dat 0.02 9 9 ed=0,1,2,3,4,5,6,7 gsas
mv supernom.gsa id31sumdbdsbs002_S9_D8.gsa
mv supernom.epf id31sumdbdsbs002_S9_D8.epf

C'est bon ?

Lien vers le commentaire
Partager sur d’autres sites

Soit tu compare les deux dossiers
diff ./alamain/ ./auscript/

Soit tu fais un diff entre les fichiers qui sont dans les dossiers

for file in `ls alamain/*`;do diff alamain/$file auscript/$file;done

encore merci theo

pour le second je ne vois pas mais la première méthode me suffit :ouioui:

bonne nuit :chinois:

Edit : bonne nuit aussi rem :mad2:

Lien vers le commentaire
Partager sur d’autres sites

:chinois: Petite confusion entre $filename et $NAME.

Les deux dernières lignes de la boucle :

       mv $filename.gsa $NAME$(echo $binning | tr -d .)_S$scan_num``_D$detector.gsa
      mv $filename.epf $NAME$(echo $binning | tr -d .)_S$scan_num``_D$detector.epf

devraient être :

       mv $filename.gsa $filename$(echo $binning | tr -d .)_S$scan_num``_D$detector.gsa
      mv $filename.epf $filename$(echo $binning | tr -d .)_S$scan_num``_D$detector.epf

D'ailleurs on peut même faire un truc un peu plus propre en enlevant les ``.

       mv $filename.gsa $filename$(echo $binning | tr -d .)_S${scan_num}_D$detector.gsa
      mv $filename.epf $filename$(echo $binning | tr -d .)_S${scan_num}_D$detector.epf

Et aussi, le sript enlève juste le '.', si tu voulais juste une multiplication par 1000 (sans les '0' préfixés), c'est ça :

       mv $filename.gsa $filename$(($binning*1000))_S${scan_num}_D$detector.gsa
      mv $filename.epf $filename$(($binning*1000))_S${scan_num}_D$detector.epf

Lien vers le commentaire
Partager sur d’autres sites

effectivement... j'avais pas noté que le nom des fichiers de sortie n'étaient pas bon.... :yes:

pour le binning, le problème est qu'il me faut bien les zéros avant... vu que ça indique si c'était un chiffre sur les dixiemes, centièmes... arf... je vois pas comment nous en sortir sur ce coup là car je pense que le point dû au nombre du binning va nous ennuyer dans le nom du fichier.... (c'est pas très propre et on bosse sous win après.. :|)

a priori on aura toujours une valeur inférieure à 1 (et supérieure à zéro) ... donc doit y avoir un truc à trouver genre "si binning strictement inférieur à 1 et supérieur ou égale à 0.1 on ajoute rien à son multiple par 1000", "si binning strictement inférieur à 0.1 et supérieur ou égale à 0.01 on ajoute un zéro avant son multiple par 1000" et si "si binning strictement inférieur à 0.01 et supérieur ou égale à 0.001 on ajoute deux zéro avant son multiple par 1000" (je ne pense pas qu'on descende en dessous de 0.001... nos valeurs habituelles sont 0.002 , 0.005 et 0.01)

c'est marrant comme un détail comme ça peut être chiant... parce que je suppose que ça va pas mal compliquer le script.... :keskidit:

(ça ne m'empèchera pas de pouvoir tester le script par rapport à ce que je vais faire à la main... ça me pemettre de le valider :craint: )

(au fait, et pour rajouter un "_" entre le nom et le binning, j'ai justeàl'insérédans la ligne ou c'est plus subtil que ça ? (oui... j'y tiens à ce "_" :-D )

donc tu peux remettre un coup le code modifié dans un prochain message (ça urge pas non plus :-D ) ... je serai sûr de ne pas faire de conneries ;)

merci encore theo ;) (et bosse bien !)

Edit : quelques modifs j'avais oublié des zéros :craint:

Lien vers le commentaire
Partager sur d’autres sites

je suppose que ça va pas mal compliquer le script.... :francais:

Non pas du tout, c'est ce que fait la première version.

tr le fait tout seul. tr remplace un caractère par un autre. Dans ce cas là, tr -d supprime un caractère (qui en l'occurrence est le point).

Dans que tu précise une partie décimale de trois chiffres (pour tes valeurs usuelles : 0.002 , 0.005 et 0.010), ça fonctionnera.

Tout ce qui est utilisé dans un script bash est soit une commande bash, soit une commande linux.

Donc pour des infos sur une commande, tu peux faire man la commande (man tr, man mv, man seq...) ou alors c'est dans l'aide de bash : man bash.

Finalement, ça donne ça :

D'ailleurs on peut même faire un truc un peu plus propre en enlevant les ``.

       mv $filename.gsa $filename$(echo $binning | tr -d .)_S${scan_num}_D$detector.gsa
      mv $filename.epf $filename$(echo $binning | tr -d .)_S${scan_num}_D$detector.epf

et tu peux tout à fait insérer un underscore au milleu (pas apès les '$' qui préfixent les noms des variables)

       mv $filename.gsa $filename_$(echo $binning | tr -d .)_S${scan_num}_D$detector.gsa
      mv $filename.epf $filename_$(echo $binning | tr -d .)_S${scan_num}_D$detector.epf

Lien vers le commentaire
Partager sur d’autres sites

Pas sûr, ça dépend du bash.

Pour tester, essaye

$((0.1+1))
$((0,1+2))

Enfin, normalement aucune raison que ça ne soit pas ça sur une machine UK, mais ne sait-on jamais. C'est tellment désagréable de perdre du temps pour cette erreur (ça ce voit que ça m'est arrivé ?)

PS : Tu vois que programmation c'est bien :transpi:

Lien vers le commentaire
Partager sur d’autres sites

déjà je travaille sur une machine qui est en France (via un protocole SSH)... mais c'est un peu l'Angleterre là bas si tu vois ce que je veux dire (avec les claviers qwerty et tout et tout) :yes:

je me dis que si quand je fais une ligne de commande je rentre un nombre décimale avec un point ... le bash doit être comme ça non ? :transpi:

en gros j'ai la flemme de me reloggé.. je viens juste de finir pour aujourd'hui... :transpi: (je le ferai demain pour être sûr...)

[HS]mais oui c'est bien ici :non:... (mais c'est pas là que j'avais posté à la base :francais:) [/HS]

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...