#1 Le 17/01/2012, à 14:13
- compte supprimé
[Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
Bonjour la communauté
J'ai un problème pour trouver la commande pour convertir les nombres de la colonne 2 en secondes.
Voici les données de départ :
1 3660
2 180
3 164
Et voilà le résultat attendu :
1 01:01:00
2 00:03:00
3 00:02:44
J'ai fait quelques recherche sur la toile mais j'ai trouvé que des bouts de réponse.
Pour convertir les secondes en heures :
date +%T -d "0000-01-01 164 seconds"
Maintenant je cherche une solution pour traiter chaque ligne en lui affectant la commande ci-dessus avec une boucle for en même avec awk ou une autre astuce ???
Dernière modification par Orion79 (Le 22/01/2012, à 11:30)
#2 Le 17/01/2012, à 14:44
- Hoper
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
Bon alors... c'est codé de façon bien lourdingue hein... On doit pouvoir réduire ça à une ou deux lignes je suis sur. L'intéret avec ma façon de coder, c'est qu'un stagiaire qui sort de l'école devrait pouvoir comprendre ce script sans la moindre difficulté
rm -f /tmp/resultats.txt
IFS="
"
for ligne in `cat /tmp/liste`
do
col1=`echo $ligne | cut -d ' ' -f1`
col2=`echo $ligne | cut -d ' ' -f2`
newcol2=`date +%T -d "0000-01-01 $col2 seconds"`
echo "$col1 $newcol2" >> /tmp/resultats.txt
done
Note : j'ai mis ton exemple de liste dans /tmp/liste. Et pour que ce script fonctionne, il faut qu'il soit très précisément comme tu l'a indiqué, a savoir un nombre, un espace, un autre nombre. Si c'est plus compliqué que ça, soit tu traite le fichier en entrée, soit je te fais la même chose avec awk en remplacement de cut.
Les resulats sont, comme tu peu le voir, mis dans /tmp/resultats.txt, en sachant que si ce fichier existe il est effacé d'entré de jeu...
Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org
Hors ligne
#3 Le 17/01/2012, à 15:37
- credenhill
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
hello
avec awk
$ awk '{printf "%02d:%02d:%02d\n", int($2/3600), int($2/60%60), $2%60}' fichier
01:01:00
00:03:00
00:02:44
$
edit : en bash
$ while read X T ; do printf "%02d:%02d:%02d\n" $(($T/3600)) $(($T/60%60)) $(($T%60)) ; done < fichier
01:01:00
00:03:00
00:02:44
$
Dernière modification par credenhill (Le 17/01/2012, à 16:38)
Hors ligne
#4 Le 17/01/2012, à 15:58
- titan77
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
salut,
je t'ai répondu sur linuxmint.
avec un while read line
#!/bin/bash
while read line
do
debut=$(echo "$line" | cut -d ' ' -f 1)
time=$(echo "$line" | cut -d ' ' -f 2)
fin=$(date +%T -d "0000-01-01 $time seconds")
echo "$debut $fin" >> time2.txt
done < time.txt
Dernière modification par titan77 (Le 17/01/2012, à 15:59)
#5 Le 17/01/2012, à 16:47
- Watael
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
salut,
while read q sec; do printf '%s %s\n' "$q" "$(date -ud@"$sec" +%T)"; done <fichier
le @ se retrouve dans la page info de date, pas dans le man.
edit: avec bash 4.2
while read a sec; do printf '%s %(%T)T\n' $a $((sec - 3600)); done <donnee
Dernière modification par Watael (Le 17/01/2012, à 21:10)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 17/01/2012, à 20:23
- Hizoka
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
while read
do
echo "${REPLY% *} $(date +%T -d "0000-01-01 "${REPLY#* } seconds")"
done < fichier
ce qui donne :
cat a
1 3660
2 180
3 164
while read
do
echo "${REPLY% *} $(date +%T -d "0000-01-01 ${REPLY#* } seconds")"
done < a
1 01:01:00
2 00:03:00
3 00:02:44
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#7 Le 17/01/2012, à 21:26
- compte supprimé
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
Merci à tous pour toutes vos solutions ! Que de choix !
Je fais toutes testées après il faudra faire un choix...
#8 Le 17/01/2012, à 22:42
- demonipuch
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
Si je peux me permettre la solution de credenhill est la meilleure puisque si une valeur dans votre fichier est supérieure à 86400 (soit un jour exprimé en secondes) la conversion est correcte.
Exemple :
$ cat fichier
1 3660
2 180
3 164
4 86399
5 85400
6 86401
$ while read X T ; do printf "%02d:%02d:%02d\n" $(($T/3600)) $(($T/60%60)) $(($T%60)) ; done < fichier
01:01:00
00:03:00
00:02:44
23:59:59
24:00:00
24:00:01
Alors qu'avec les autres solutions vous obtiendrez
01:01:00
00:03:00
00:02:44
23:59:59
00:00:00
00:00:01
Hors ligne
#9 Le 18/01/2012, à 11:09
- compte supprimé
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
En fait ces résultats proviennent de cette de commande (un peu bricolé) qui me permet de lister les pistes et la durée de celle-ci.
track_sec=$(mplayer -dvd-device /dev/sr0 dvd:// -vo null -frames 0 -ao null -identify | grep "ID_DVD_TITLE_" | grep "LENGTH" | awk -F [_=.] '{print $4,$6}')
echo "$track_sec"
Il ne faut pas oublier de mettre un DVD dans le lecteur...
Maintenant je ne trouve pas la solution pour intégré cette commande avec la solution de credenhill.
#10 Le 18/01/2012, à 17:23
- twocats
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
Pour avoir un truc de ce genre :
J'y travail...
Dernière modification par twocats (Le 18/01/2012, à 17:26)
La réponse est 42
Hors ligne
#11 Le 18/01/2012, à 18:54
- compte supprimé
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
Pour avoir un truc de ce genre
C'est exactement ce que j'aimerais obtenir via zenity !
#12 Le 18/01/2012, à 19:19
- twocats
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
Disponible ici :
http://h264tobox.free.fr/pub/dvdxtractor-0.2.tar.gz
ATTENTION, le script est très loin d'être fini et fiable.
Principe :
- Insérez le DVD dans le lecteur de votre ordinateur, attendre que le système le détecte.
- Lancez le script, il va trouver AUTOMATIQUEMENT votre dvd.
Dépendances : aften, dvdbackup, lsdvd, mplayer, mplex et zenity.
EDIT : Version 0.2
Dernière modification par twocats (Le 18/01/2012, à 23:48)
La réponse est 42
Hors ligne
#13 Le 21/01/2012, à 10:29
- compte supprimé
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
Quelqu'un pourrait me donner des explications sur cette ligne de commande :
$ awk '{printf "%02d:%02d:%02d\n", int($2/3600), int($2/60%60), $2%60}' fichier
Surtout cette partie...
int($2/60%60)
Merci
#14 Le 21/01/2012, à 12:27
- credenhill
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
$2 contient le nombre de secondes, donc
printf "%02d:%02d:%02d\n", on imprime 3 nombres sur 2 positions avec un zero devant pour les nombres < 10
int($2/3600), on obtient le nombres d'heures
int($2/60%60), on divise par 60 et on garde le reste de la division (modulo) pour avoir le nombres de minutes
($2%60}' modulo 60, on obtient le nombre secondes restantes
Hors ligne
#15 Le 21/01/2012, à 17:03
- compte supprimé
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
$2 contient le nombre de secondes, donc
printf "%02d:%02d:%02d\n", on imprime 3 nombres sur 2 positions avec un zero devant pour les nombres < 10
int($2/3600), on obtient le nombres d'heures
int($2/60%60), on divise par 60 et on garde le reste de la division (modulo) pour avoir le nombres de minutes
($2%60}' modulo 60, on obtient le nombre secondes restantes
Merci credenhill !
CQFD en fait je n'avais pas compris l'histoire du modulo... mais c'est OK.
#16 Le 21/01/2012, à 17:06
- compte supprimé
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
Sinon j'ai encore une question.
Serait-il possible d'intégré cette commande avec awk :
date -u -d @var +%T
où var peut-être une valeur en seconde p. ex. date -u -d @3726 +%T
avec le fichier time.txt qui contient ceci :
1 3660
2 180
3 164
Je penser à quel quel chose ressemblant à ça :
awk -v var=$2 '{print "date -u -d @var +%T"}' time.txt
Mais bien sûr elle ne fonctionne pas !
Dernière modification par Orion79 (Le 21/01/2012, à 17:08)
#17 Le 21/01/2012, à 17:22
- credenhill
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
comme ça
$ awk '{"date -u -d @" $2 " +%T" | getline d ; print d}' time.txt
01:01:00
00:03:00
00:02:44
$
Hors ligne
#18 Le 22/01/2012, à 10:35
- compte supprimé
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
Ta commande fonctionne ! Mais si je change les valeur du fichier time.txt par ces données :
1 4969
2 0
3 0
4 35
5 0
6 33
7 4969
Le retour de la commande me retourne :
01:22:49
00:00:00
00:00:00
00:00:35
00:00:35
00:00:33
00:00:33
date: date non valide «@»
00:00:33
Sinon peux-tu me donner quelques explications sur cette commande ?
A+
#19 Le 22/01/2012, à 11:05
- credenhill
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
effectivement il y a une erreur. Il faut fermer le pipe à chaque passage, essaye
awk '{"date -ud@" $2 " +%T"|getline d ; close("date -ud@" $2 " +%T") ; print d}' time.txt
"date -ud@" $2 " +%T"|getline d on fabrique une commande date avec $2 dont la sortie est pipée dans la variable d par getline
Dernière modification par credenhill (Le 22/01/2012, à 11:16)
Hors ligne
#20 Le 22/01/2012, à 11:29
- compte supprimé
Re : [Résolu] Bash convertir secondes en heure sur plusieurs lignes ???
Merci sujet résolu !