Cập nhật:
Đây là một triển khai mới sử dụng dc
"cơ sở đầu ra". Lưu ý rằng nếu tổng tiền là hơn 60 giờ, điều này sẽ tạo ra bốn giá trị được phân tách bằng dấu cách thay vì ba. (Và nếu tổng tiền dưới một giờ, chỉ có hai giá trị được phân tách bằng dấu cách sẽ được xuất ra.)
awk '{print $2}' file.txt | tr : \ | dc -f - -e '60o0ddd[+r60*+r60d**+z1<a]dsaxp'
Đầu vào được giả định là ba lần giờ, phút, giây, như trong câu hỏi.
Đầu ra trên đầu vào được cung cấp là:
16 43
Câu trả lời gốc:
Hãy làm điều này với dc
Máy tính bàn của bạn. Đó là back-end bc
và nó cực kỳ linh hoạt mặc dù thường được coi là khó hiểu.
Đầu tiên, một số tiền xử lý chỉ cung cấp thời gian và chuyển đổi dấu hai chấm thành khoảng trắng:
awk '{print $2}' | tr : ' '
Chúng tôi cũng có thể làm điều này với Sed:
sed -En -e 's/^.*([0-9][0-9]):([0-9][0-9]):([0-9][0-9]).*$/\1 \2 \3/p'
Tôi sẽ đi với Awk và tr
vì nó đơn giản hơn. Một trong hai lệnh trên tạo ra một đầu ra sạch theo định dạng sau. (Tôi đang sử dụng văn bản ví dụ của riêng mình vì tôi cho rằng nó thú vị hơn; bao gồm cả giờ. Bạn cũng sẽ làm việc.)
$ cat input
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18
Thời gian đã cho ở định dạng trên, chạy chúng thông qua tập lệnh Sed sau đây và đưa kết quả vào dc
như được hiển thị:
sed -e '1s/^/0 /' -e 's/$/ r 60 * + r 60 60 * * + +/' -e '$s/$/ 60 60 * ~ 60 ~ f/' input | dc
(Bị hỏng để giảm cuộn sang một bên :)
sed <input \
-e '1s/^/0 /' \
-e 's/$/ r 60 * + r 60 60 * * + +/' \
-e '$s/$/ 60 60 * ~ 60 ~ f/' |
dc
Đầu ra sẽ là giây, phút, giờ, theo trình tự đó. (Lưu ý đây là một chuỗi đảo ngược.) Tôi chỉ đang học dc
nên đây không phải là một giải pháp hoàn hảo, nhưng tôi nghĩ nó khá tốt cho cái nhìn đầu tiên dc
.
Ví dụ đầu vào và đầu ra, được dán trực tiếp từ thiết bị đầu cuối của tôi:
$ cat input
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18
$ sed -e '1s/^/0 /' -e 's/$/ r 60 * + r 60 60 * * + +/' -e '$s/$/ 60 60 * ~ 60 ~ f/' input | dc
16
55
42
$