2010-02-02 14 views

Respuesta

39

Pruebe awk. Como extra, puedes mantener los segundos divididos.

echo "00:20:40.25" | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }' 
+1

Gracias, esta es una manera muy limpia de hacerlo, justo lo que quería. Además, las matemáticas no son realmente mi punto fuerte. – Mint

+0

¡Muy útil, gracias! Para horas decimales: 'echo" 00: 20: 40.25 "| awk -F: '{imprimir $ 1 + ($ 2/60) + ($ 3/3600)}' ' –

1

No he probado esto, pero creo que así es como dividirías la cadena. Seguido de multiplicar por las cantidades apropiadas durante horas y minutos.

mytime=’00:20:40.28′ 
part1=${mytime%%:*}; rest=${mytime#*:} 
part2=${rest%%:*}; rest=${rest#*:} 
part3=${rest%%:*}; 
1

con la cáscara,

#!/bin/bash 

d="00:20:40.28" 
IFS=":" 
set -- $d 
hr=$(($1*3600)) 
min=$(($2*60)) 
sec=${3%.*} 
echo "total secs: $((hr+min+sec))" 
3

Prueba esto:

T='00:20:40.28' 
SavedIFS="$IFS" 
IFS=":." 
Time=($T) 
Seconds=$((${Time[0]}*3600 + ${Time[1]}*60 + ${Time[2]})).${Time[3]} 
IFS="$SavedIFS" 

echo $Seconds 

($ <cadena>) Fraccionamientos <cadena> basado en el divisor (IFS).

$ { <matriz> [ < índice >]} devuelve el elemento de la <array> en el < índice >.

$ (( < expresión aritmética >)) realiza la expresión aritmética.

Espero que esto ayude.

+0

esto falla cuando $ {Time [2]} contiene un punto decimal. – dreamlax

+0

'IFS =" :. "' y 'Segundos = $ ((...)) $ {Tiempo [3]}' –

+0

Gracias a los dos, lo echo de menos. – NawaMan

2

Esto funcionaría incluso si no se especifica horas o minutos: echo "04:20:40" | sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc

0

Puede convertir minutos a horas, segundos o minutos con el comando bc.

Por ejemplo:

cuántos minutos por 1.000 seg?

$ echo 'obase=60;1000' | bc 
02 00 

a continuación -> 2 min

¿Cuánto hora por 375 min?

$ echo 'obase=60;375'| bc 
06 15 

a continuación -> 06h15

Cómo día de 56 horas?

$ echo 'obase=24;56' | bc 
02 08 

luego de 02 días y 08 horas

bc con obase es extra!

+0

Con números mayores para convertir 14400 minutos en días):' echo "obase = 60; 14777" | bc 04 01 17 '(4 días, 1 hora y 17 minutos!) –

+0

14400 minutos es 10 días (hay 24 horas en un día, no 60). –

+0

Efectivamente, cometí un error. nosotros no hacemos eso Un convertido en hora es preferible ... y tómese los minutos. –

0

Con fecha de GNU, puede realizar la conversión si la duración es inferior a 24 horas, tratándola como si fuera un momento del día en la época:

to_seconds() { 
    local epoch=$(date --utc -d @0 +%F) 
    date --utc -d "$epoch $1" +%s.%09N 
} 

Correr con el ejemplo de la pregunta:

$ to_seconds 00:20:40.29 
1240.290000000 

Tenga en cuenta que --utc, @, %s y %N son todas las extensiones GNU no necesariamente apoyadas por otras implementaciones.

0
echo "40.25" | awk -F: '{ if (NF == 1) {print $NF} else if (NF == 2) {print $1 * 60 + $2} else if (NF==3) {print $1 * 3600 + $2 * 60 + $3} }' 
40.25 
echo "10:40.25" | awk -F: '{ if (NF == 1) {print $NF} else if (NF == 2) {print $1 * 60 + $2} else if (NF==3) {print $1 * 3600 + $2 * 60 + $3} }' 
640.25 
echo "20:10:40.25" | awk -F: '{ if (NF == 1) {print $NF} else if (NF == 2) {print $1 * 60 + $2} else if (NF==3) {print $1 * 3600 + $2 * 60 + $3} }' 
72640.25 
0

Si usted no sabe qué es exactamente lo que tiene - SS, MM: SS o HH: MM: SS, como después de youtube-dl --get-duration, entonces la magia awk podría ser útil:

echo 12 | awk -F\: '{ for(k=NF;k>0;k--) sum+=($k*(60^(NF-k))); print sum }' 
12 
echo 35:12 | awk -F\: '{ for(k=NF;k>0;k--) sum+=($k*(60^(NF-k))); print sum }' 
2112 
echo 1:35:12 | awk -F\: '{ for(k=NF;k>0;k--) sum+=($k*(60^(NF-k))); print sum }' 
5712 
Cuestiones relacionadas