2017-01-22 16 views
7

Tôi có tệp có chứa Dấu thời gian theo định dạng H:M:S.MS, tôi có thể đọc và in tất cả Dấu thời gian đã lưu nhưng khi tôi thực hiện một số thao tác số học như Trừ (nói Timestamp2 - Timestamp1) t cho tôi câu trả lời, tôi không có kinh nghiệm làm việc với lập trình kịch bản bash.Trừ hai dấu thời gian trong tập lệnh bash

Mọi đề xuất, đề xuất sẽ được đánh giá cao.

Đây là số screen shot của sự cố của tôi.

Dưới đây là một ví dụ:

Start Time = 17:53:01.166721 
End Time = 17:53:01.369787 

Kết quả dự kiến ​​cho End Time - Start Time là một trong hai 0:00:0.203066 hoặc 0.203066.

+0

Dấu thời gian của bạn thu được như thế nào? có lẽ chúng tôi đang gặp vấn đề XY ở đây: bạn đang cố gắng thời gian một quá trình? –

+1

Vui lòng thêm đầu vào mẫu và đầu ra mong muốn của bạn cho đầu vào mẫu đó cho câu hỏi của bạn. – Cyrus

+0

Bạn có quyền truy cập vào ngày GNU không? – Cyrus

Trả lời

7

Nếu bạn muốn xử lý ngày bằng cách sử dụng công cụ dòng lệnh đơn giản, bạn cần phải chuyển đổi timestamps vào một số dễ thỏa thuận với các định dạng, như thời đại dựa trên.

Bạn có thể làm điều này với date lệnh, mà bạn có thể bọc trong một chức năng như vậy:

timestamp() { 
    date '+%s%N' --date="$1" 
} 
# timestamp "12:20:45.12345" ==> 1485105645123450000 

Sau đó, bạn có thể trừ trực tiếp:

echo $(($(timestamp "${Stime[$i]}") - $(timestamp "${Rtime[$i]}"))) 

Lưu ý rằng kể từ khi bạn không phải là theo dõi ngày nhưng chỉ có thời gian, bạn sẽ có lỗi khi, ví dụ, thời gian bắt đầu là 23:59:59 và thời gian kết thúc là 00:00:01.

0

Giả sử biến của bạn là số nguyên, bạn cần phải bao gồm phép tính của bạn trong một đánh giá số học để làm việc đó.

echo $((VAR1 - VAR2)) 

Hoặc, nếu bạn muốn gán giá trị:

VAR3=$((VAR1 - VAR2)) 
+0

Bạn không cần ký hiệu $ cho các biến trong ngữ cảnh (()). – Inian

+0

Cảm ơn bạn Fred ... – Ali

+0

Cảm ơn bạn Inian ... – Ali

0

Nếu bạn cần phải sử dụng bash, bạn cần phải chuyển đổi dấu thời gian thành một giá trị số nguyên:

$ time="12:34:56.789" 
$ IFS=":." read -r h m s ms <<<"$time" 
$ echo $h $m $s $ms 
12 34 56 789 
$ milliseconds=$(((h*3600 + m*60 + s)*1000 + ms)) 
$ echo $milliseconds 
45296789 

Sau đó, bạn có thể trừ để nhận được một số mili giây đại diện cho sự khác biệt.

Convert to giây với một số số học và chuỗi xây dựng:

$ seconds="$((milliseconds/1000)).$((milliseconds % 1000))" 
$ echo $seconds 
45296.789 

Để giải quyết điểm hợp lệ gniourf_gniourf của (một cách vụng về):

$ time="12:34:56.7" 
$ IFS=":." read -r h m s ms <<<"$time" 
$ ms="${ms}000"; ms=${ms:0:3} 
$ echo $h $m $s $ms 
12 34 56 700 
# .......^^^ 

Ngoài ra, chuỗi là số bát phân không hợp lệ như "08" và "09" sẽ ném lỗi trong số học bash, do đó khai báo rõ ràng chúng là cơ sở 10

milliseconds=$(((10#$h*3600 + 10#$m*60 + 10#$s)*1000 + 10#$ms)) 
+0

Điều này chỉ hoạt động nếu có 3 chữ số sau dấu chấm thập phân. –

+0

Cảm ơn bạn rất nhiều glenn jackman – Ali

Các vấn đề liên quan