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
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