2010-02-02 49 views

Trả lời

39

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 }' 
+1

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

+0

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)}' ' –

1

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%%:*}; 
1

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))" 
3

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.

+0

này thất bại khi $ {Time [2]} chứa dấu thập phân. – dreamlax

+0

'IFS =" :. "' và 'Giây = $ ((...)) $ {Thời gian [3]}' –

+0

Cảm ơn cả hai bạn, tôi nhớ điều đó. – NawaMan

2

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

0

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!

+0

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!) –

+0

14400 phút là 10 ngày (có 24 giờ trong ngày, không phải 60). –

+0

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. –

0

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%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.

0
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 
0

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ác vấn đề liên quan