tronquer une string avec sed ou gawk

tronquer une string avec sed ou gawk - Shell/Batch - Programmation

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.
 
 
 
 

Reply

Marsh Posté le 25-06-2005 à 09:23:48   

Reply

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


---------------
Institutions européennes: Ensemble d'outils dont le but est de transformer une grande quantité d'argent en merde. Cette merde est utilisée pour créer de nouveaux fonctionnaires. L'argent restant payant des externes pour faire leur travail.
Reply

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

Reply

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.
 

Reply

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) }'
1
ROOT:belokan# echo 012 | awk '{ print int($1) }'
12
ROOT:belokan# echo 000 | awk '{ print int($1) }'
0


Message édité par Deadlock le 25-06-2005 à 23:19:49

---------------
Institutions européennes: Ensemble d'outils dont le but est de transformer une grande quantité d'argent en merde. Cette merde est utilisée pour créer de nouveaux fonctionnaires. L'argent restant payant des externes pour faire leur travail.
Reply

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)}'}
??

Reply

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.


---------------
Institutions européennes: Ensemble d'outils dont le but est de transformer une grande quantité d'argent en merde. Cette merde est utilisée pour créer de nouveaux fonctionnaires. L'argent restant payant des externes pour faire leur travail.
Reply

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

Reply

Marsh Posté le 25-06-2005 à 16:35:11    

enlève les espaces avant et après =


---------------
Institutions européennes: Ensemble d'outils dont le but est de transformer une grande quantité d'argent en merde. Cette merde est utilisée pour créer de nouveaux fonctionnaires. L'argent restant payant des externes pour faire leur travail.
Reply

Marsh Posté le 25-06-2005 à 16:36:12    

Merci bocou bocou bocou :)

Reply

Marsh Posté le 25-06-2005 à 16:36:12   

Reply

Marsh Posté le 25-06-2005 à 17:14:22    

De rien ;)


---------------
Institutions européennes: Ensemble d'outils dont le but est de transformer une grande quantité d'argent en merde. Cette merde est utilisée pour créer de nouveaux fonctionnaires. L'argent restant payant des externes pour faire leur travail.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed