Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1100 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1553224
souliane
Posté le 03-05-2007 à 15:26:16  profilanswer
 

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
mood
Publicité
Posté le 03-05-2007 à 15:26:16  profilanswer
 

n°1555237
souliane
Posté le 04-05-2007 à 11:36:21  profilanswer
 

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

n°1555259
souliane
Posté le 04-05-2007 à 11:59:33  profilanswer
 

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
n°1555282
matafan
Posté le 04-05-2007 à 13:01:30  profilanswer
 

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

n°1555394
souliane
Posté le 04-05-2007 à 15:02:35  profilanswer
 

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.

n°1555457
matafan
Posté le 04-05-2007 à 16:09:56  profilanswer
 

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

n°1555508
souliane
Posté le 04-05-2007 à 18:35:09  profilanswer
 

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 !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 

Sujets relatifs
Rassembler dans un seul fichier des informations dispersées[Résolu] Lien sur page HTML qui lance un fichier EXE ?
Fichier .genRemplacement/suppression d'un chaine de caractère dans un fichier
parcours d un fichier xml non logique avec javascriptCréer un fichier de resources pour gcc
Traitement d'une fonction Ping avec une liste de PC ds un fichier exlBien structurer un fichier XML
import gros fichier SQL dans Mysql 
Plus de sujets relatifs à : Conversion durées -> secondes sur un fichier avec sed


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR