Memperbarui:
Berikut ini adalah implementasi baru yang memanfaatkan dc
"basis output". Perhatikan bahwa jika jumlah total lebih dari 60 jam, ini akan menampilkan empat nilai yang dipisahkan oleh ruang alih-alih tiga. (Dan jika jumlah total kurang dari satu jam, hanya dua nilai yang dipisahkan ruang akan menjadi output.)
awk '{print $2}' file.txt | tr : \ | dc -f - -e '60o0ddd[+r60*+r60d**+z1<a]dsaxp'
Input diasumsikan dalam tiga kali lipat jam, menit, detik, seperti yang ditunjukkan dalam pertanyaan.
Output pada input yang disediakan adalah:
16 43
Jawaban asli:
Ayo lakukan ini dengan dc
Desk Calculator Anda. Ini adalah back-end untuk bc
, dan itu sangat fleksibel meskipun sering dianggap samar.
Pertama, beberapa pra-pemrosesan untuk memberikan waktu saja, dan mengubah titik dua menjadi spasi:
awk '{print $2}' | tr : ' '
Kita juga bisa melakukan ini dengan Sed:
sed -En -e 's/^.*([0-9][0-9]):([0-9][0-9]):([0-9][0-9]).*$/\1 \2 \3/p'
Saya akan pergi dengan Awk dan tr
karena lebih sederhana. Salah satu dari perintah di atas menghasilkan output bersih dalam format berikut. (Saya menggunakan contoh teks saya sendiri karena saya menganggapnya lebih menarik; sudah termasuk jam. Anda akan bekerja juga.)
$ cat input
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18
Diberikan waktu dalam format di atas, jalankan melalui script Sed berikut dan kirimkan hasilnya dc
seperti yang ditunjukkan:
sed -e '1s/^/0 /' -e 's/$/ r 60 * + r 60 60 * * + +/' -e '$s/$/ 60 60 * ~ 60 ~ f/' input | dc
(Rusak untuk mengurangi pengguliran ke samping :)
sed <input \
-e '1s/^/0 /' \
-e 's/$/ r 60 * + r 60 60 * * + +/' \
-e '$s/$/ 60 60 * ~ 60 ~ f/' |
dc
Outputnya adalah detik, menit, jam, dalam urutan itu. (Perhatikan ini adalah urutan terbalik.) Saya baru belajar dc
jadi ini bukan solusi yang sempurna, tapi saya pikir ini cukup bagus untuk dilihat pertama kali dc
.
Contoh input dan output, disisipkan langsung dari terminal saya:
$ 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
$