PDA

View Full Version : [XML] Simulare codice bash


dany1900
22-11-2015, 18:03
Salve dovrei fare qualcosa di questo tipo,il mio codice bash è cosi formato,lancia un simulatore che tirerà fuori molti valori su un file,poi devo svolgere operazioni su un file next.lp ed avviare glpsol...insomma un codice bash con variabili,file.dat etc ....adesso vorrei parsarlo e dichiarare tutto con xml,qualcuno sa aiutarmi? C è un modo semplice?

ecco il mio codice


#!/bin/bash

#cancello eventuali file rimasti dalle precedenti esecuzioni
find . -type f -name sequenzanextlpdisordinata.dat -exec rm {} \;
find . -type f -name sequenzasimulatore.dat -exec rm {} \;
find . -type f -name SequenzaSimulatoreFinale.dat -exec rm {} \;
find . -type f -name SimulatoreFinale.dat -exec rm {} \;

#metto i comandi da lanciare nelle variabili in maniera tale da richiamarle piu semplicemente quando servono
esecuzione="gcc -o simulatore simulator.c -DINIT_X_IL=valore_x_il -DINIT_X_VO=valore_x_vo"
esecuzione1="./simulatore "
esecuzione2="glpsol --lp next.lp -o next.sol"

#compilo il simulatore
$esecuzione
#metto il risultato estratto dal simulatore in un file
$esecuzione1 > sequenzasimulatore.dat



#questa in un colpo filtra con awk il file e restituisce la sequenza ordinata e numerata del simulatore,senza quello che non serve e appende il risultato in un file
arr1=( $(awk -F " " '{if (/^[0-9]/) print $1 " " $2 " " $3 " " $4}; END {printf "\n"}' sequenzasimulatore.dat | tee -a SequenzaSimulatoreFinale.dat ) )

#setto i valori delle variabili x_iL,x_vO a 0 e w_u a 1 nel file next.lp,per fare la prima esecuzione
sed -ri "s/x_iL = [\-]*[0-9]\.*[0-9]*/x_iL = 0 /; s/\x_vO = [\-]*[0-9]\.*[0-9]*/x_vO = 0 /; s/\w_u = [0-1]/w_u = 1 / " next.lp
sed -i -e '1d' SequenzaSimulatoreFinale.dat

arr3=( $(awk -F " " '{if (/^[0-9]/) print $1 " " $2 " " $3 " " $4}; END {printf "\n"}' SequenzaSimulatoreFinale.dat ) )

#imposto l intervallo di valori del file,erano da 10000 passi cosi è diventato da 1000
sed -n -i '1~10p' SequenzaSimulatoreFinale.dat


#numero le righe nel file,necessario per graficare poi con gnuplot
cut -d ' ' -f 1 --complement SequenzaSimulatoreFinale.dat | nl > simulatorefinaleordinato.dat

#tolgo la colonna relativa all azione w_u,non mi serve per graficare con gnuplot,cosi facendo il file ricavato dal simulatore è pronto per essere graficato
arr5=( $(awk -F " " '{if (/[0-9]/) print $1 " " $3 " " $4}; END {printf "\n"}' simulatorefinaleordinato.dat | tee -a SimulatoreFinale.dat ))





#leggo tutti i valori del file sequenzasimulatore riga per riga
while read line; do
grep -q '^[0-9]' <<< "$line" || continue ##prendo solo le righe che iniziano con un intero

arr4=($(cut -f 2 <<< "$line" )) #"copio" il valore dell azione,la seconda colonna del file ricavato dal simulatore
sed -ri " s/(^w_u = )([+-]?[0-9]+(\.[0-9]+)?)(.*)/\\1${arr4[0]}/" next.lp #incollo il valore dell azione copiato in precedenza e lo assegno a w_u nel file next.lp


$esecuzione2 ##faccio l esecuzione con glpsol


##prendo il secondo campo di x_il' e x_vO' in next.sol e lo metto in sequenzanextlpdiordinata.dat,file non ancora definitivo
arr2=( $(awk -F "' " 'BEGIN {printf d line" "}; {if (/x_iL|x_vO/) printf d $2" "}; END {printf "\n"}' next.sol | tee -a sequenzanextlpdisordinata.dat ) )



##poi aggiorno il file next.lp con i valori dell'array,quindi x_iL e x_vO verranno aggiornati con i valori restituiti dall esecuzione in next.sol
sed -i s"/\(x_iL = \)[\-]*[0-9]\.*[0-9]*/\\1${arr2[0]}/; s/\(x_vO = \)[0-9]\.*[0-9]*/\\1${arr2[1]}/" next.lp






done < simulatorefinaleordinato.dat #prendo sequenzasimulatore.dat come file in cui fare le operazioni sopra citate

#numero le righe nel file costruendo cosi il file definitivo che puo essere graficato con gnuplot
cat sequenzanextlpdisordinata.dat | nl > SequenzaNextLp.dat

#elimino i file inutili cosi da non avere la cartella troppo incasinata di cose che non servono
find . -type f -name sequenzanextlpdisordinata.dat -exec rm {} \;
find . -type f -name sequenzasimulatore.dat -exec rm {} \;
find . -type f -name SequenzaSimulatoreFinale.dat -exec rm {} \;

# Genero un file .gp temporaneo che poi verrà elaborato da gnuplot,lo scopo è quello di confrontare il file del simulatore a quello generato da next.lp col glpsol
( echo 'set term png' #setto il terminale con l estensione png,le immagini saranno quindi di questo formato
echo 'set output "grafico x_iL.png"' #setto come output di questo grafico il nome "grafico x_iL.png"
echo 'plot "SimulatoreFinale.dat" using 1:2 w l, "SequenzaNextLp.dat" using 1:2 w l' #genero il grafico prendendo la prima e seconda colonna dei due file da confrontare (confronto la prima variabile x_iL)
echo 'set output "grafico x_vO.png" ' #do un nome all altro file da graficare
echo 'plot "SimulatoreFinale.dat" using 1:3 w l, "SequenzaNextLp.dat" using 1:3 w l' #genero il grafico prendendo la prima e terza colonna dei due file da confrontare (confronto la seconda variabile x_vO)
echo 'set output "grafico completo.png"' #do il nome al grafico completo che verrà generato per ultimo
echo 'plot "SimulatoreFinale.dat" using 1:2 w l , "SimulatoreFinale.dat" using 1:3 w l, "SequenzaNextLp.dat" using 1:2 w l, "SequenzaNextLp.dat" using 1:3 w l' ) > temp.gp #genero un grafico che comprende i confronti sia della prima variabile che della seconda

#avvio il file temporaneo creato in pecedenza,cosi da eseguire tutte le istruzioni
gnuplot temp.gp

#elimino il file temporaneo creato prima,ormai i grafici sono stati generati e non serve piu
find . -type f -name temp.gp -exec rm {} \;




ho difficoltà proprio gia dall inizio,come faccio a dichiarare tutti i dati del file next.lp e sequenzasimulatore.dat?

sequenza simulatore.dat è cosi composto
1 0.5 3.4 4.3 3
2 3 4.5 3.2 1
.
.
.
100000 4.5 3.4 2 3

devo dichiarare tutto con xml,ma come avrete capito non sono pratico di questo linguaggio

dany1900
24-11-2015, 20:09
nessuno sa proprio aiutarmi?

Daniels118
27-11-2015, 17:16
Forse dai qualcosa per scontato, io non ho capito cosa vuoi fare, mi sfugge la relazione tra bash e xml, il primo è un linguaggio di scripting, il secondo un linguaggio di markup.

dany1900
27-11-2015, 20:38
Forse dai qualcosa per scontato, io non ho capito cosa vuoi fare, mi sfugge la relazione tra bash e xml, il primo è un linguaggio di scripting, il secondo un linguaggio di markup.

Infatti non ho le idee chiarissime,ma simulare quel codice con un parsing e implementarlo un po con xml non è possibile?

WarDuck
28-11-2015, 15:19
Infatti non ho le idee chiarissime,ma simulare quel codice con un parsing e implementarlo un po con xml non è possibile?

Di certo hai le idee confuse... ma tanto confuse.

Cerca di spiegare meglio qual è il problema e cosa vuoi fare, se non lo sai neanche te di certo non lo possiamo sapere noi.

Da quel poco che si capisce devi lanciare un simulatore che tira fuori dei dati e li salva su file. OK.

Che cosa c'azzecca l'XML? Vuoi usarlo come INPUT (per passare parametri di configurazione ad esempio) o dev'essere OUTPUT di qualcosa (per salvare i risultati)?

fano
30-11-2015, 09:41
XML serve per mostrare dei dati è come un file .txt o .doc non è un linguaggio di programmazione quindi non può "simulare" bash così come non può simulare C o null'altro...

Perché non fare lo script in bash appunto usando... bash?

Daniels118
30-11-2015, 12:06
Infatti non ho le idee chiarissime,ma simulare quel codice con un parsing e implementarlo un po con xml non è possibile?
Partiamo dall'inizio... il tuo codice attualmente funziona? Se si, c'è un motivo per il quale vorresti modificarlo? Se non c'è motivo allora lascialo com'è, se invece hai un'esigenza spiega qual'è e vediamo di capire esattamente cosa devi fare.
Se ti interessa approfondire il linguaggio xml per cultura personale possiamo sicuramente darti chiarimenti ed indicarti tutorial adeguati senza scomodare la shell bash.

dany1900
02-12-2015, 20:44
Allora cerco di spiegarmi meglio,lo script bash funziona,ma ho esigenza di fare lo stesso lavoro con xml,partendo da quel codice,e poi usare un parser per sostituire numero e nome variabili etc ,il comportamento però deve seguire quello dello script bash

qualcosa del genere


<configuration>
<simulator>
<compilator>gcc -o compilatore simulator.c </compilator>
<src>simulator.c</src>
<numero_passi>10000</numero_passi>
<periodicita>10</periodicita>
<colonna_passi>1</colonna_passi>
<colonna_azione>2</colonna_azione>
<colonna_var1>3</colonna_ var1>
<colonna_var2>4</colonna_var2>
<output_sim>simulatorefinale.dat</output_sim>
</simulator>
<MILP>
<src>next.lp</src>
<var1>x_iL</var1>
<var2>x_vO</var2>
<azione>w_u</azione>
<esecuzione>glpsol --lp next.lp -o next.sol</esecuzione>
<output_exe>next.sol</output_exe>
<final_output>SequenzaNextLp.dat</final_output>
</MILP>
<gnuplot>
<format>set term png</format>
<input1_src>SimulatoreFinale.dat</input1_src>
<input2_src>SequenzaNextLp.dat</input2_src>
<graph_var1>
<setting1>set output "grafico x_iL.png"</setting1>
<plot>plot "SimulatoreFinale.dat" using 1:2 w l, "SequenzaNextLp.dat" using 1:2 w l</plot>
</graph_var1>
<graph_var2>
<setting2>set output "grafico x_vO.png"</setting2>
<plot2>plot "SimulatoreFinale.dat" using 1:3 w l, "SequenzaNextLp.dat" using 1:3 w l</plot2>
</graph_var2>
<graph_full>
<setting3>set output "grafico completo.png"</setting3>
<plot3>plot "SimulatoreFinale.dat" using 1:2 w l , "SimulatoreFinale.dat" using 1:3 w l, "SequenzaNextLp.dat" using 1:2 w l, "SequenzaNextLp.dat" using 1:3 w l</plot3>
</graph_full>
</gnuplot>
</configuration>


Questa è una bozza,ma devo implementare quel codice bash in xml e poi parsarlo,quindi come input e poi esegue lo script bash dopo le dovute procedure di parsing/validazione
Dovrei anche dirgli che come si puo vedere dallo script bash , ad ogni esecuzione viene presa l azione del simulatore anche nel "MILP",spero mi sono spiegato bene :) perche avrei difficoltà anche nel parsing,purtroppo non sono cosi pratico di xml

Daniels118
03-12-2015, 08:38
Il mio sospetto è che tu abbia un tool di automazione configurabile attraverso un file in formato xml, se è così devi dirci come si chiama il tool, altrimenti è impossibile aiutarti. Se invece mi sbaglio allora credo proprio che ciò che vuoi fare sia impossibile.

P.S. non sarà per caso ant???

dany1900
09-12-2015, 18:51
Il mio sospetto è che tu abbia un tool di automazione configurabile attraverso un file in formato xml, se è così devi dirci come si chiama il tool, altrimenti è impossibile aiutarti. Se invece mi sbaglio allora credo proprio che ciò che vuoi fare sia impossibile.

P.S. non sarà per caso ant???

Non ho alcun tool...quello che dovrei fare è prendere l xml di input ed eseguire tutto quel codice bash

quindi ad esempio nella prima parte


#cancello eventuali file rimasti dalle precedenti esecuzioni
find . -type f -name sequenzanextlpdisordinata.dat -exec rm {} \;
find . -type f -name sequenzasimulatore.dat -exec rm {} \;
find . -type f -name SequenzaSimulatoreFinale.dat -exec rm {} \;
find . -type f -name SimulatoreFinale.dat -exec rm {} \;



ci sarà una printf ad esempio,dopo dovrei eseguire il codice bash alla stessa maniera


<compilator>gcc -o simulatore simulator.c -DINIT_X_IL=valore_x_il -DINIT_X_VO=valore_x_vo </compilator>
<source>simulator.c</source>
<esecuzione>./ simulatore</esecuzione>
<numero_passi>10000</numero_passi>
<periodicita>10</periodicita>

ovvero prima cosa cerco dentro al tag xml simulatore cosa c è...nel bash vedo che devo compilare prima,quindi nell xml leggo dentro il tag compilator,poi eseguire quello che c è all interno del tag esecuzione,quindi eseguirà ./simulatore nel mio caso etc
praticamente dovrei parsare il file xml in maniera tale da generare quello script,trovo un po di difficoltà a fare questo