Conversion durées -> secondes sur un fichier avec sed

Conversion durées -> secondes sur un fichier avec sed - Shell/Batch - Programmation

Marsh Posté le 03-05-2007 à 15:26:16    

Bonjour,
 
j'ai un fichier contenant des durées exprimées sous le format 00:00:00.00 et j'aimerai bien convertir ça en nombre de secondes... J'ai fait la fonction suivante :
 

Code :
  1. #conversion des durees en secondes
  2. function TimeInSeconds
  3. {
  4.     FORMAT='(([0-9]+):)?([0-9]+):([0-9]{2}).([0-9]{2})'
  5.     if [[ $1 =~ $FORMAT ]] ; then
  6.         HH=${BASH_REMATCH[2]:-0}
  7.         MM=${BASH_REMATCH[3]:-0}
  8.         SS=${BASH_REMATCH[4]:-0}
  9.         RR=${BASH_REMATCH[5]}
  10.         echo $(( HH * 3600 + MM * 60 + SS )).$RR
  11.     else
  12.         echo $1
  13.     fi
  14. }


 
qui marche bien lorsque je l'appelle en passant le paramètre à la main, par exemple comme ça :
 
TimeInSeconds 43:22.03
 
ce qui renvoie 2602.03. Mais quand j'essaie de l'appliquer à mon fichier à l'aide de sed, ça foire et c'est le "else" qui est éxécuté. Par exemple :
 
cat $FILE | sed "s/[0-9:.]*/`TimeInSeconds \&`/g"
 
va me récrire le contenu du fichier à l'identique... Ca fait plusieurs heures que je suis la dessus et je vais péter les plombs !!!! Merci pour votre aide.


Message édité par souliane le 04-05-2007 à 11:42:29
Reply

Marsh Posté le 03-05-2007 à 15:26:16   

Reply

Marsh Posté le 04-05-2007 à 11:36:21    

Personne ne sait ? Je craque completement... si je remplace FORMAT par '.*' la chaine envoyé par sed est reconnue par la fonction, mais dès que je complique FORMAT en mettant par exemple '[0-9].*' ça ne marche pas...

Reply

Marsh Posté le 04-05-2007 à 11:59:33    

Genre voilà un exemple complet à mettre dans un fichier script.sh :
 


#!/bin/bash
 
#conversion des durees en secondes
function TimeInSeconds
{
    #       12      2 1 3      3 4        4  5        5
    FORMAT='(([0-9]+):)?([0-9]+):([0-9]{2})\.([0-9]{2})'
    if [[ $1 =~ $FORMAT ]] ; then
        HH=${BASH_REMATCH[2]:-0}
        MM=${BASH_REMATCH[3]:-0}
        SS=${BASH_REMATCH[4]:-0}
        RR=${BASH_REMATCH[5]}
        echo $1 = $(( HH * 3600 + MM * 60 + SS )).$RR
    else
        echo $1 "n'a pas pu etre converti"
    fi
}
 
TIME="23:54.03"
TimeInSeconds $TIME
 
echo $TIME > test
sed "s/[0-9:.]*/`TimeInSeconds \&`/g" test


 
et voilà le résultat de son appel :
 


[xxx@xxx]# sh script.sh
23:54.03 = 1434.03
23:54.03 n'a pas pu etre converti


 
Vous y comprenez quelque chose ?!


Message édité par souliane le 04-05-2007 à 12:04:00
Reply

Marsh Posté le 04-05-2007 à 13:01:30    

Dans ta ligne sed, la partie entre backquotes est appelé par le shell avant que la ligne soit passée en argument à sed. Donc le shell appelle la fonction TimeInSeconds avec pour argument un charactère "&". La fonction écrit "23:54.03 n'a pas pu etre converti" puisque "&" n'est pas une date valide, et finalement le shell appelle sed "s/[0-9:.]*/23:54.03 n'a pas pu etre converti/g" test

Reply

Marsh Posté le 04-05-2007 à 15:02:35    

Ok, mais pourquoi la fonction écrit "23:54.03 n'a pas pu etre converti" ? Le  $1 est censé valoir & et non pas 23:54.03 non ?
 
Autre bizarrerie, en ajoutant ces deux lignes au tout début de la fonction :
 
echo -n "$1"
echo -n "$1" > output
 
la première ligne va faire afficher 23:54.03 sur la sortie standard, alors que la deuxième va écrire & dans le fichier output...
 
En tout cas merci pour ton explication.

Reply

Marsh Posté le 04-05-2007 à 16:09:56    

En fait oui, je me suis planté sur ce point. En fait la fonction écrit écrit "& n'a pas pu etre converti", et ensuite c'est sed qui remplace les "&" par ce qui a maché, c'est-à-dire "23:54.03".

Reply

Marsh Posté le 04-05-2007 à 18:35:09    

D'accord ! Ca me parait clair maintenant mais bon sang, c'est tout de meme assez tordu. Merci beaucoup, j'ai appris un bon truc grace a toi :)
 
PS : j'ai viré cette merde et remplacer par du awk, c'est beaucoup mieux !

Reply

Sujets relatifs:

Leave a Replay

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