Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/01/2012, à 14:13

compte supprimé

[Résolu] Bash convertir secondes en heure sur plusieurs lignes ???

Bonjour la communauté smile

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é smile

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 :
1326900161.png
J'y travail... smile

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

twocats a écrit :

Pour avoir un truc de ce genre

C'est exactement ce que j'aimerais obtenir via zenity ! big_smile

#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 smile

#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 ???

credenhill a écrit :

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

Serait-il possible d'intégré cette commande avec awk :

date -u -d @var +%T

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 ! roll

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 ! smile