Простой способ конвертировать ЧЧ: ММ: СС (часы: минуты: секунды.сплит секунды) в секунды - PullRequest
25 голосов
/ 02 февраля 2010

Какой простой способ преобразовать 00:20:40.28 (ЧЧ: ММ: СС) в секунды с помощью Bash-скрипта?

Можно отключить доли секунды, это не обязательно.

Ответы [ 11 ]

47 голосов
/ 02 февраля 2010

Попробуйте awk. В качестве бонуса вы можете сохранить доли секунд.

echo "00:20:40.25" | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }'
3 голосов
/ 02 февраля 2010

Попробуйте это:

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

($ ) разбивается на основе разделителя (IFS).

$ { []} возвращает элемент в .

$ (( <арифметическое выражение> )) выполняет арифметическое выражение.

Надеюсь, это поможет.

2 голосов
/ 23 ноября 2017
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
2 голосов
/ 08 мая 2013

Если вы обрабатываете время с ps, учтите, что формат 2-18:01 также возможен в течение 2 дней, 19 часов, 1 минуты.В этом случае вы захотите оформить: Разобрать вывод ps "etime" и преобразовать его в секунды

2 голосов
/ 20 ноября 2011

Это будет работать, даже если вы не указали часы или минуты: echo "04:20:40" | sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc

1 голос
/ 30 декабря 2017

Если вы не знаете, что именно у вас есть - 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
1 голос
/ 26 июля 2017

С датой 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, которые не обязательно поддерживаются другими реализациями.

0 голосов
/ 25 февраля 2019

У меня есть эта старая функция оболочки (/ bin / sh совместимая в смысле оболочки POSIX, а не bash), которая выполняет это преобразование в целочисленной математике (без дробей в секундах):

tim2sec() {
    mult=1
    arg="$1"
    res=0
    while [ ${#arg} -gt 0 ]; do
        prev="${arg%:*}"
        if [ "$prev" = "$arg" ]; then
            curr="${arg#0}"  # avoid interpreting as octal
            prev=""
        else
            curr="${arg##*:}"
            curr="${curr#0}"  # avoid interpreting as octal
        fi
        curr="${curr%%.*}"  # remove any fractional parts
        res=$((res+curr*mult))
        mult=$((mult*60))
        arg="$prev"
    done
    echo "$res"
}

Выходы:

$ tim2sec 1:23:45.243
5025

Работает только с SS, MM: SS и HH: MM: SS:)

0 голосов
/ 03 мая 2017

Вы можете преобразовать минуты в часы, секунды или минуты с помощью команды 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 часов

до н.э. с obase является дополнительным!

0 голосов
/ 02 февраля 2010

с оболочкой,

#!/bin/bash

d="00:20:40.28"
IFS=":"
set -- $d
hr=$(($1*3600))
min=$(($2*60))
sec=${3%.*}
echo "total secs: $((hr+min+sec))"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...