[Risolto] script bash, non andare a capo

Ciao a tutti

devo fare un programmino bash che legge da diverse cartelle (for esterno) e poi in ogni cartella diversi files (for interno), crea tre variabili e li mette una dopo l’altra in un file datafile.txt


for I  in `seq 8720 2 8908`;   ##### for on the timebins
do
for J in 'eta' 'm1' 'm2' 'mchirp' 'dec' 'dist' 'RA' 'iota'
do WITH_MEAN=`awk NR==4 ./calamp/93993$I/"$J"_stats.dat | awk '{print $2}'`;
WITHOUT_MEAN=`awk NR==4 ./nocalamp/93993$I/"$J"_stats.dat | awk '{print $2}'`;
WITHOUT_VAR=`awk NR==1 ./nocalamp/93993$I/"$J"_stats.dat | awk '{print $2}'`;
#echo $I $WITH_MEAN $WITHOUT_MEAN; 
echo $I $WITH_MEAN $WITHOUT_MEAN $WITHOUT_VAR >> datafile.txt;
done;

done;

quello che vorrei è non andare a capo ogni volta nel for interno, quando aggiungo a datafile per i diversi parametri, ma solo alla fine di esso, quando incremento il timebins.

Ora “>>” sembra automaticamente andare a capo, cosa dovrei fare per continuare ad aggiungere nella stessa riga?

Grazie
S.

credo tu debba passare il parametro “line”, ripeto credo e al momento non saprei dove aggiungerlo.
ci penso su…

ciao geno, grazie

googlando dopo un po’ ho trovato la semplice opzione -n di echo!

quindi era echo a mandare a capo non “>>” :slight_smile:

grazie
S.

figurati :slight_smile:

I due maggiori servono in bash a redirigere un output verso un file. L’output viene “appeso” al file esistente.

echo è un comando che stampa sullo standard output qualcosa. L’opzione -n serve ad eliminare le nuove linee.

Mi spiace non essere arrivato prima a darti un suggerimento. Ragionando a posteriori era da pensare subito ad echo e al suo output. “>>” mette tutto quello che gli arriva nel file in un “colpo solo” (per intenderci), non manda a capo ciò che gli viene passato.

Ciao Mario, grazie.

Avrei un’altra domanda, più elaborata, se possibile continuare nello stesso thread (magari cambiando in titolo in uno più generico)

Mi piacerebbe che il codice che ho messo prima, che adesso è diventato:



 cat creator.sh 
#echo "tbin" "eta" "m1" "m2" "mchirp" "dec" "dist" "RA" "iota" >> datafile.txt;
for I  in `seq 8444 2 8908`;   ##### for on the timebins
do echo -n $I" " >> datafile.txt;
for J in 'eta' 'm1' 'm2' 'mchirp' 'dec' 'dist' 'RA' 'iota'
do WITH_MEAN=`awk NR==4 ./calamp/93993$I/"$J"_stats.dat | awk '{print $2}'`;
WITHOUT_MEAN=`awk NR==4 ./nocalamp/93993$I/"$J"_stats.dat | awk '{print $2}'`;
WITHOUT_VAR=`awk NR==1 ./nocalamp/93993$I/"$J"_stats.dat | awk '{print $2}'`;
#echo $I $WITH_MEAN $WITHOUT_MEAN; 
echo -n $WITH_MEAN $WITHOUT_MEAN $WITHOUT_VAR" ">> datafile.txt;
done; 
echo >> datafile.txt;
done;

comprendesse un controllo, fra il primo e il secondo for, che le cartelle:

./calamp/93993$I

e

./nocalamp/93993$I

siano entrambi esistenti e non vuote. Se è cosi procede, se non è cosi, salta il for secondario per quel valore di I, e riparte con I+2

Grazie
S.

Puoi mettere un controllo if con l’opzione -d che riporta vero se il file esiste ed è una directory. A questo controllo aggiungi un AND che devi scrivere con && con ls che riporta eventuali output della directory (cioè se è popolata).
Vedi:

if  -d "$DIR" && `ls $DIR` ]]; then
    echo esiste ed è popolata
fi

ciao Mario, grazie

ma come dichiaro DIR? ho provato

dir_cal="./calamp/93993$I/";

o con tutti gli altri tipi di virgolette, ma mi dà errore…
S.

edit: scusate errore mio, avevo dimenticato di spostare il “do” del for al posto giusto

S.

Ragazzi, scusate se rompo ancora: posso lanciare questi comandi shell dall’interno di un python?

import os
os.system("/percorso/script_bash")