tronquer une string avec sed ou gawk - Shell/Batch - Programmation
Marsh Posté le 25-06-2005 à 12:13:02
Donne l'input exacte et l'output souhaitée ca sera plus simple pour se comprendre
Marsh Posté le 25-06-2005 à 14:16:30
Ben je vois pas comment expliquer mieux ... Alors je reprends :
j'ai trois variables qui sont min ,sec et milli d'un temps type chronomètre : x'xx''xxx
objectif, si parmi les variables secondes ou millisecondes j'ai des 0 au début, je veux les enlever.
Donc concrètement :
pour le temps 1'08''009 je splite en min=1 sec=08 et milli=009. Moi je veux la moulinette qui va me faire passer à sec=8 et milli=9.
Mais cette moulinette ne devra rien faire si sec=57 ou si milli=230.
Par contre si sec=00 ou milli=000, je veux en retour sec=0 et milli=0.
Donc moi ce que je veux faire (et je sais pas si c'est la meilleure solution)
read min sec mill "1'56''023"
sec=moulinette(sec);
milli=moulinette(milli);
avec la moulinette qui est qqchoz du genre:
echo $variable | gawk '{if length($0)==2 (donc sec)
retirer au plus le premier 0 à $variable
else (donc milli)
retirer au plus les deux premiers 0 à $variable}'
Merci pour ton aide
Marsh Posté le 25-06-2005 à 14:33:52
J'ai trouvé une solution hyper laborieuse avec sed:
Moulinette:
echo $variable | sed "s/^000$/a/"
| sed "s/^00$/a/"
| sed "s/^0*//"
| sed "s/a/0/"
Si jamais vous avez plus propre avec gawk, je préfèrerais
Merci.
Marsh Posté le 25-06-2005 à 16:08:10
Tu peux aussi simplement convertir ta string en integer ... ça marche à tous les coups
ROOT:belokan# echo 001 | awk '{ print int($1) }' |
Marsh Posté le 25-06-2005 à 16:13:21
la grande classe
Merci infiniment
Mais que dois-je faire pour que ça marche comme ça:
var= ${echo $var | awk '{ print int($1)}'}
??
Marsh Posté le 25-06-2005 à 16:25:33
Si tu veux vraiment jouer avec les length et tester si chaque position de gauche à droite est égale ou non à "0" tu peux le faire comme ça:
echo $var | awk 'int($1) != 0 { for ( i = 1; i <= length($1); i++ ) if ( substr($1, i, 1) != "0" ) { print substr($1, i) ; exit } } { print "0" }' |
Pour ta variable, fais le comme ça:
var=`echo $var | awk '{ print int($1) }'` |
Les back-quotes `` permettent d'executer la commande se trouvant entre elles pour "seter" une variable.
Marsh Posté le 25-06-2005 à 16:34:07
ça marche pas avec les back-quotes
numero=06
numero = `echo $numero | gawk '{ print int($1) }'`
echo $numero
->numero: command not found
06
Je suis sous cygwin/bash/xp...
Marsh Posté le 25-06-2005 à 16:35:11
enlève les espaces avant et après =
Marsh Posté le 25-06-2005 à 17:14:22
De rien
Marsh Posté le 25-06-2005 à 09:23:48
Salut, j'ai une string "chronomètre" splitée en 3 strings (minutes, secondes millisecondes) et j'aimerai tronquer les secondes et millisecondes de la manière suivante :
exemples pour les secondes :
'26' -> rien à faire
'60' -> rien à faire
'08' -> '8'
'00' -> '0'
exemples pour les millisecondes :
'860' -> rien à faire
'800' -> rien à faire
'075' -> '75'
'006' -> '6'
'000' -> '0'
Pour le moment le meilleur truc que j'ai trouvé c'est :
echo "275" | sed s/^0*//" -> '275'
echo "075" | sed s/^0*//" -> '75'
echo "005" | sed s/^0*//" -> '5'
Le pb c'est si j'ai '000' ben ça me retourne une chaine vide. Faudrait que je puisse en tronquer au plus 2.
Et puis je suis obligé de distinguer les secondes et millisecondes. Donc 2 fonctions de tronquage sed différentes.
A moins que je puisse faire une fonction gawk du type :
gawk '{
Si longueur(string)==2 alors je tronque un éventuel premier 0;
Si longueur(string)==3 alors je tronque au plus les deux premiers 0;
}'
Mais je connais pas la syntaxe de cette fonction de folie lol.
Merci à vous si vous êtes inspirés.