अपडेट करें:
यहाँ एक नया कार्यान्वयन है जो dc
's' आउटपुट बेस का उपयोग करता है। ध्यान दें कि यदि कुल योग 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 -En -e 's/^.*([0-9][0-9]):([0-9][0-9]):([0-9][0-9]).*$/\1 \2 \3/p'
मैं अवाक के साथ जाऊँगा और tr
क्योंकि यह सरल है। उपरोक्त कमांड में से कोई भी निम्न प्रारूप में एक साफ आउटपुट उत्पन्न करता है। (मैं अपने स्वयं के उदाहरण पाठ का उपयोग कर रहा हूं क्योंकि मैं इसे और अधिक दिलचस्प मानता हूं; इसमें घंटे शामिल हैं। आपका काम भी यही होगा।)
$ cat input
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18
उपरोक्त प्रारूप में समय को देखते हुए, उन्हें निम्न सेड स्क्रिप्ट के माध्यम से चलाएं और परिणाम 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
$