Cách dễ dàng để chuyển đổi 00:20:40.28
(HH: MM: SS) thành giây bằng tập lệnh Bash là gì?Cách đơn giản để chuyển đổi HH: MM: SS (giờ: phút: giây.split giây) thành giây
Tách giây có thể bị cắt bỏ, không cần thiết.
Cách dễ dàng để chuyển đổi 00:20:40.28
(HH: MM: SS) thành giây bằng tập lệnh Bash là gì?Cách đơn giản để chuyển đổi HH: MM: SS (giờ: phút: giây.split giây) thành giây
Tách giây có thể bị cắt bỏ, không cần thiết.
Hãy thử awk
. Như một phần thưởng, bạn có thể giữ lại giây phân chia.
echo "00:20:40.25" | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }'
Tôi chưa thử nghiệm điều này nhưng, tôi nghĩ đây là cách bạn muốn chia chuỗi. Tiếp theo là nhân với số tiền thích hợp cho giờ và phút.
mytime=’00:20:40.28′
part1=${mytime%%:*}; rest=${mytime#*:}
part2=${rest%%:*}; rest=${rest#*:}
part3=${rest%%:*};
với vỏ,
#!/bin/bash
d="00:20:40.28"
IFS=":"
set -- $d
hr=$(($1*3600))
min=$(($2*60))
sec=${3%.*}
echo "total secs: $((hr+min+sec))"
Hãy thử điều này:
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
($ < chuỗi >) chia < chuỗi > dựa trên splitter (IFS
).
$ { < mảng > [ <index>]} trả về phần tử của < mảng > tại <index>.
$ (( < biểu thức số học >)) thực hiện biểu thức số học.
Hy vọng điều này sẽ hữu ích.
này sẽ làm việc ngay cả khi bạn không ghi rõ số giờ hoặc phút: echo "04:20:40" | sed -E 's/(.*):(.+):(.+)/\1*3600+\2*60+\3/;s/(.+):(.+)/\1*60+\2/' | bc
Nếu bạn đang xử lý một thời gian từ ps
, tâm trí bạn rằng các định dạng 2-18:01
Cũng có thể trong 2 ngày, 19 giờ , 1 phút. Trong trường hợp đó, bạn sẽ muốn thanh toán: Parse ps' "etime" output and convert it into seconds
Bạn có thể chuyển đổi phút thành giờ, giây hoặc phút bằng lệnh bc
.
Ví dụ:
Bao nhiêu phút trong 1000 giây?
$ echo 'obase=60;1000' | bc
02 00
sau đó -> 2 phút
bao nhiêu giờ cho 375 phút?
$ echo 'obase=60;375'| bc
06 15
sau đó -> 06h15
Làm thế nào ngày đối với 56 giờ?
$ echo 'obase=24;56' | bc
02 08
sau đó 02 ngày và 08 giờ
bc với obase là thêm!
Với số lượng lớn hơn để chuyển đổi 14400 phút trong ngày):' echo "obase = 60; 14777" | bc 04 01 17 '(4 ngày, 1 giờ và 17 phút!) –
14400 phút là 10 ngày (có 24 giờ trong ngày, không phải 60). –
Hiệu quả, tôi đã phạm sai lầm. chúng tôi không làm điều đó. Một chuyển đổi trong giờ là thích hợp hơn ... và mất vài phút. –
Với ngày GNU, bạn có thể thực hiện việc chuyển đổi nếu thời gian ít hơn 24 giờ, bằng cách xử lý nó như là một thời gian trong ngày trên thời đại:
to_seconds() {
local epoch=$(date --utc -d @0 +%F)
date --utc -d "$epoch $1" +%s.%09N
}
Chạy nó với các ví dụ từ câu hỏi:
$ to_seconds 00:20:40.29
1240.290000000
Lưu ý rằng --utc
, @
, %s
và %N
đều mở rộng GNU không nhất thiết phải được hỗ trợ bởi việc triển khai khác.
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
Nếu bạn không biết chính xác những gì bạn có - SS, MM: SS hoặc HH: MM: SS, như sau youtube-dl --get-duration
, sau đó awk ma thuật có thể hữu ích:
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
Cảm ơn, đây là một cách rất sạch sẽ để làm điều đó, chỉ là những gì tôi muốn. Toán học cũng không thực sự là điểm mạnh của tôi. – Mint
Khá hữu ích, cảm ơn! Số thập phân: 'echo" 00: 20: 40,25 "| awk -F: '{print $ 1 + ($ 2/60) + ($ 3/3600)}' ' –