ปรับปรุง:
นี่คือการใช้งานใหม่ที่ใช้ประโยชน์จากdc
"ฐานการส่งออก" โปรดทราบว่าหากผลรวมทั้งหมดมากกว่า 60 ชั่วโมงจะส่งออกค่าที่คั่นด้วยช่องว่างสี่ค่าแทนที่จะเป็นสาม (และถ้าผลรวมทั้งหมดน้อยกว่าหนึ่งชั่วโมงจะมีเอาต์พุตเพียงสองค่าที่คั่นด้วยช่องว่าง)
awk '{print $2}' file.txt | tr : \ | dc -f - -e '60o0ddd[+r60*+r60d**+z1<a]dsaxp'
การป้อนข้อมูลจะถือว่าเป็นสามเท่าของชั่วโมงนาทีวินาทีที่แสดงในคำถาม
เอาต์พุตของอินพุตที่จัดเตรียมไว้คือ:
16 43
คำตอบเดิม:
มาทำสิ่งนี้กับdc
เครื่องคำนวณตั้งโต๊ะของคุณ มันเป็นแบ็คเอนด์bc
และมีความยืดหยุ่นอย่างมากแม้ว่ามักจะถือว่าเป็นความลับ
ก่อนการประมวลผลล่วงหน้าบางอย่างเพื่อให้เวลาเท่านั้นและแปลงโคลอนเป็นช่องว่าง:
awk '{print $2}' | tr : ' '
เราสามารถทำได้ด้วย Sed:
sed -En -e 's/^.*([0-9][0-9]):([0-9][0-9]):([0-9][0-9]).*$/\1 \2 \3/p'
ฉันจะไปกับ Awk และtr
เพราะมันง่ายกว่า คำสั่งด้านบนอย่างใดอย่างหนึ่งสร้างเอาต์พุตใหม่ทั้งหมดในรูปแบบต่อไปนี้ (ฉันใช้ข้อความตัวอย่างของตัวเองเพราะฉันคิดว่ามันน่าสนใจมากกว่านี้มีเวลารวมอยู่ด้วยคุณจะทำงานได้ดี)
$ cat input
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18
ให้เวลาในรูปแบบข้างต้นเรียกใช้ผ่านสคริปต์ Sed ต่อไปนี้และไพพ์ผลลัพธ์ลงdc
ในดังที่แสดง:
sed -e '1s/^/0 /' -e 's/$/ r 60 * + r 60 60 * * + +/' -e '$s/$/ 60 60 * ~ 60 ~ f/' input | dc
(แยกย่อยเพื่อลดการเลื่อนด้านข้าง :)
sed <input \
-e '1s/^/0 /' \
-e 's/$/ r 60 * + r 60 60 * * + +/' \
-e '$s/$/ 60 60 * ~ 60 ~ f/' |
dc
เอาต์พุตจะเป็นวินาที, นาที, ชั่วโมงตามลำดับนั้น (หมายเหตุนี้เป็นลำดับตรงกันข้าม.) ฉันแค่การเรียนรู้dc
ดังนั้นนี้ไม่ได้เป็นโซลูชั่นที่สมบูรณ์แบบdc
แต่ฉันคิดว่ามันสวยดีสำหรับดูครั้งแรกที่
ตัวอย่างอินพุตและเอาต์พุตวางโดยตรงจากเทอร์มินัลของฉัน:
$ 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
$