Güncelleme:
İşte dc's "çıktı tabanı" kullanan yeni bir uygulama . Toplam toplam 60 saatten fazlaysa, bunun üç yerine dört boşlukla ayrılmış değer vereceğini unutmayın . (Toplam toplam bir saatten azsa, yalnızca iki boşlukla ayrılmış değer verilir.)
awk '{print $2}' file.txt | tr : \ | dc -f - -e '60o0ddd[+r60*+r60d**+z1<a]dsaxp'
Girişin, soruda gösterildiği gibi, saat, dakika, saniye üç katı olduğu varsayılır.
Sağlanan girişteki çıkış:
16 43
Orijinal cevap:
Bunu dcMasa Hesap Makinesi ile yapalım . Bu arka uç bcve sık sık şifreli olarak kabul edilse de son derece esnektir.
İlk olarak, bazı zamanlar sadece süreleri vermek ve iki nokta üst üste işaretini boşluklara dönüştürmek için:
awk '{print $2}' | tr : ' '
Bunu Sed ile de yapabiliriz:
sed -En -e 's/^.*([0-9][0-9]):([0-9][0-9]):([0-9][0-9]).*$/\1 \2 \3/p'
Awk ile gideceğim ve trdaha basit. Yukarıdaki komutlardan biri, aşağıdaki biçimde temiz bir çıktı üretir. (Kendi örnek metnimi kullanıyorum çünkü daha ilginç buluyorum; saatler dahil. Sizin de çalışacak.)
$ cat input
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18
Yukarıdaki formatta verilen süreler, aşağıdaki Sed komut dosyasında çalıştırılır ve sonucu dcgösterildiği gibi aktarılır :
sed -e '1s/^/0 /' -e 's/$/ r 60 * + r 60 60 * * + +/' -e '$s/$/ 60 60 * ~ 60 ~ f/' input | dc
(Yan kaydırmayı azaltmak için parçalara ayrıldı :)
sed <input \
-e '1s/^/0 /' \
-e 's/$/ r 60 * + r 60 60 * * + +/' \
-e '$s/$/ 60 60 * ~ 60 ~ f/' |
dc
Çıktı, bu sırayla saniye, dakika, saat olacaktır. (Bu tersine çevrilmiş bir dizidir.) Sadece öğreniyorum, dcbu yüzden bu mükemmel bir çözüm değil, ama ilk bakışta oldukça iyi olduğunu düşünüyorum dc.
Doğrudan terminalimden yapıştırılan örnek giriş ve çıkış:
$ 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
$