使用Bash脚本将00:20:40.28
(HH:MM:SS)转换为秒的简单方法是什么?
可以删除分秒,这不是必需的。
答案 0 :(得分:46)
试试awk
。作为奖励,你可以保持分秒。
echo "00:20:40.25" | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }'
答案 1 :(得分: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> )根据拆分器(IFS
)拆分< string> 。
$ {< array> [< index> ]}在< array> 的元素><索引> 的
$((< arithmetic expression> ))执行算术表达式。
希望这有帮助。
答案 2 :(得分:2)
即使您未指定小时或分钟,这也会有效:echo "04:20:40" | sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc
答案 3 :(得分:2)
如果您正在处理ps
的时间,请注意格式2-18:01
也可以使用2天,19小时,1分钟。在这种情况下,您需要结帐:Parse ps' "etime" output and convert it into seconds
答案 4 :(得分:2)
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
答案 5 :(得分:1)
如果你不知道你到底有什么 - 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
答案 6 :(得分:0)
我没有对此进行过测试,但我认为这是你分割字符串的方式。然后乘以适当的小时和分钟数量。
mytime=’00:20:40.28′
part1=${mytime%%:*}; rest=${mytime#*:}
part2=${rest%%:*}; rest=${rest#*:}
part3=${rest%%:*};
答案 7 :(得分:0)
使用shell,
#!/bin/bash
d="00:20:40.28"
IFS=":"
set -- $d
hr=$(($1*3600))
min=$(($2*60))
sec=${3%.*}
echo "total secs: $((hr+min+sec))"
答案 8 :(得分:0)
您可以使用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 with obase是额外的!
答案 9 :(得分:0)
使用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扩展。
答案 10 :(得分:0)
我有这个旧的shell函数(在POSIX shell上是/ bin / sh兼容的,不是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:)
答案 11 :(得分:0)
TZ=utc date +'%s' -d "1970-01-01 00:00:38"
答案 12 :(得分:0)
我认为最简单的方法是从纪元时间开始计算:
WITH test_table(col1, col2) AS (
SELECT 1, array_construct('toto@gmail.com', 'hello@yahoo.com')
)
SELECT
col1,
col2,
pseudonymize_email(col2) as hashed_emails
FROM test_table
您还可以根据需要轻松更改格式。