¿Cuál es una forma fácil de convertir 00:20:40.28
(HH: MM: SS) a segundos con un script Bash?Forma simple de convertir HH: MM: SS (horas: minutos: segundos segundos) a segundos
Los segundos fraccionados se pueden cortar, no es esencial.
¿Cuál es una forma fácil de convertir 00:20:40.28
(HH: MM: SS) a segundos con un script Bash?Forma simple de convertir HH: MM: SS (horas: minutos: segundos segundos) a segundos
Los segundos fraccionados se pueden cortar, no es esencial.
Pruebe awk
. Como extra, puedes mantener los segundos divididos.
echo "00:20:40.25" | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }'
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%%:*};
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))"
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.
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
Si está procesando un momento de ps
, que conste que el formato 2-18:01
También es posible durante 2 días, 19 horas , 1 minuto. En ese caso, querrá pagar: Parse ps' "etime" output and convert it into seconds
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!
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!) –
14400 minutos es 10 días (hay 24 horas en un día, no 60). –
Efectivamente, cometí un error. nosotros no hacemos eso Un convertido en hora es preferible ... y tómese los minutos. –
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.
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
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
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
¡Muy útil, gracias! Para horas decimales: 'echo" 00: 20: 40.25 "| awk -F: '{imprimir $ 1 + ($ 2/60) + ($ 3/3600)}' ' –