Какой простой способ конвертировать 00:20:40.28
(HH: MM: SS) в секундах с помощью Bash script?
Разделенные секунды могут быть вырезаны, а это не существенно.
Какой простой способ конвертировать 00:20:40.28
(HH: MM: SS) в секундах с помощью Bash script?
Разделенные секунды могут быть вырезаны, а это не существенно.
Попробуйте awk
. В качестве бонуса вы можете сохранить разделенные секунды.
echo "00:20:40.25" | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }'
Попробуйте следующее:
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
($ <string> ) разбивает <string> на основе разделителя (IFS
).
${ <array> [ <index> ]} возвращает элемент <array> в < индекс > .
$((< арифметическое выражение > )) выполняет арифметическое выражение.
Надеюсь, что это поможет.
Это будет работать, даже если вы не укажете часы или минуты: echo "04:20:40" | sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc
Я не тестировал это, но, думаю, так вы разделили бы строку. Затем следуют умножение на соответствующие суммы в течение нескольких часов и минут.
mytime=’00:20:40.28′
part1=${mytime%%:*}; rest=${mytime#*:}
part2=${rest%%:*}; rest=${rest#*:}
part3=${rest%%:*};
с оболочкой,
#!/bin/bash
d="00:20:40.28"
IFS=":"
set -- $d
hr=$(($1*3600))
min=$(($2*60))
sec=${3%.*}
echo "total secs: $((hr+min+sec))"
Если вы обрабатываете время из ps
, помните, что формат 2-18:01
также возможен в течение 2 дней, 19 часов, 1 минуты. В этом случае вам нужно проверить: Parse ps ' "etime" выводить и преобразовывать его в секунды
Вы можете преобразовать минуты в час, секунды или минуты с помощью команды bc
.
Пример:
Сколько минут за 1000 секунд?
$ echo 'obase=60;1000' | bc
02 00
затем → 2 мин
Сколько часов в течение 375 минут?
$ echo 'obase=60;375'| bc
06 15
затем → 06h15
Как дни за 56 часов?
$ echo 'obase=24;56' | bc
02 08
затем 02 дней и 08 часов
bc с obase добавочно!
С датой GNU вы можете выполнить преобразование, если продолжительность составляет менее 24 часов, рассматривая его как время дня в эпоху:
to_seconds() {
local epoch=$(date --utc -d @0 +%F)
date --utc -d "$epoch $1" +%s.%09N
}
Запустив его с примером из вопроса:
$ to_seconds 00:20:40.29
1240.290000000
Обратите внимание, что --utc
, @
, %s
и %N
- это все расширения GNU, которые не обязательно поддерживаются другими реализациями.
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
Если вы не знаете, что именно у вас есть - SS, MM: SS или HH: MM: SS, как после youtube-dl --get-duration
, тогда может быть полезно awk magic:
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