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 dc
Masa Hesap Makinesi ile yapalım . Bu arka uç bc
ve 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 tr
daha 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 dc
gö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, dc
bu 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
$