A nouveau quelques commentaires sur la nouvelle version de ton script.
Il ne faut oublier qu'avec les outils dont on dispose sous Unix, les choses peuvent être effectuées de plusieurs manières. Chaque programmeur à ses outils préférés et son style de programmation.
Il ne faut pas hésiter à utiliser 'man' ou 'info'.
- t_max=$(ls | grep -o "^${basename}.*txt" | cut -d'=' -f3 | cut -d'.' -f1 | sort -rn | awk '(NR = 1) {printf ("%.0f\n",$1) }' -)
# ne marche pas...
cut -d'=' -f3
A moins que le format des noms de fichier ai changé, '=' n'est pas présent dans le nom =>
cut -d'-' -f6
awk '(NR = 1) {printf ("%.0f\n",$1) }' -
Il y a beaucoup plus simple, 'head' permet de récupérer les lignes en début de fichier =>
head -1
A partir du moment où le préfixe du nom du fichier est un paramètre (basename), tu ne peux pas récupérer le temps comme tu le fais sinon tu imposes une structure à ce préfixe.
Les fichiers on pour nom $[basename}temps.txt, pour récupérer le temps il suffit d'éliminer les préfixe et le suffixe (.txt) :
sed -e 's/^'/${basename}//' -e 's/.txt$//'
t_max=$(ls | grep -o "^${basename}.*\.txt" | sed -e 's/^'/${basename}//' -e 's/.txt$//' | sort -rn | head -1)
|
Une autre façon de faire est d'utiliser 'awk' pour remplacer grep+sed+sort+head :
t_max=$( ls | awk ' # Analyse de la liste des fichiers
$1 ~ "^" BASE "[0-9]+\\.txt" { # Sélectionne fichiers BASEn.txt ou est n est numérique gsub("^" BASE,"",$1); # Supprime le préfixe BASE
sub(/\.txt$/,"" ); # Supprime l'extension '.txt' en fin
if ($1 > max) max=$1; # Mémorise le plus grand temps
}
END { # Lorsque tout le fichier a été traité
print max; # Affiche le plus grand temps
} BASE=$Basename ' # La variable BASE est initialisée pour awk
)
|
- dest_file=resul\_${basename}${tps_debut}\_to\_${t_max}\_dec\=${graph_decal}\.txt # verbose file name
Dans la mesure ou tu utilise la syntaxe ${var}, les '\' sont inutiles :
dest_file=resul_${basename}${tps_debut}_to_${t_max}_dec=${graph_decal}.txt
ou
dest_file=resul\_$basename$tps_debut\_to\_$t_max\_dec=$graph_decal\.txt
- if [ -e ${dest_file} ]; then rm ${dest_file}; fi
Ok, mais en plus simple :
rm -f ${dest_file}
- # on utilise awk pour récupérer la première colonne avec la première ligne
touch $dest_file
touch temp
awk '( NF == 5 ) { printf ("%.2f\n", $1 ) }' ${basename}${tps_debut}\.txt > temp
mv temp $dest_file
Il suffit de prendre le premier champ de toutes les lignes du fichier avec 'cut' pour qui le séparateur des champ par défaut est la tabulation (ce qui corresponds à tes fichiers).
cut -f1 ${basename}${tps_debut}.txt > ${dest_file}
|
Si tu veux effectivement vérifier le nombre de champs des lignes récupérées, ton 'awk' fonctionne mais est à simplifier :
awk 'NF==5 {print $1}' ${basename}${tps_debut}\.txt > ${dest_file}
Attention, si tu veux blinder un peu ton script, il te faudra vérifier au préalable l'existence de ce fichier.
De manière générale, tous les paramètres passés doivent être contrôlés (existence fichier, numéricité...).
- awk '( NR != 1 ) && ( NF == 5 ) {printf ("%.16f\n", $num_col+decal*i) }' i=$i num_col=$num_col decal=$graph_decal $file
Attention ici tu ne sélectionnes pas la première ligne d'en-tête, alors que tu la prise en compte pour initialiser ton fichier ${dest_file}.
En bash (et ksh) il est possible de faire de l'arithmétique sans passer par expr :
(( i = i + ))
(( i += 1 ))
(( i++ ))
L'incrémentation de i pourrait même se faire au niveau du 'awk'
awk 'NF==5 {printf ("%.16f\n", $num_col+decal*i) }' i=$((i++)) num_col=$num_col decal=$graph_decal $file
$((i++)) : Substitution de la variable i PUIS incrément de la variable.
A ne pas confondre avec $((++i)) qui incrémente la variable i AVANT de la substituer.
C'est le même comportement qu'en C.
- l'algorithme se ralentit avec l'augmentation du nombre de fichiers
Pour n fichiers en entrée, tu fait n 'paste' qui au total lisent 2n fichiers pour créer en créer n.
Il faudrait modifier l'algorithme pour diminuer le nombre de 'paste'.
Par exemple, dans la boucle 'for', pour chaque fichier entrée créer un fichier résultat et faire en final un ou plusieurs 'paste' (par tranche de fichiers) pour regrouper les fichiers.
Cygwin n'est pas très rapide (tout du moins sur mon PC qui n'est qu'un antique Pentium 160).
Bon courage pour la suite.
Pour ma part c'est une semaine de congés
---------------
Jean Pierre.