বাশ ব্যবহার করে সময় যোগ করতে কিভাবে?


12

আমি জানাতে চাই যে আমার কম্পিউটারে সিরিজ প্রক্রিয়াগুলির একটি সিরিজ আমার সময় নেবে কিনা তা স্থির করতে আমার আরও শক্তিশালী কম্পিউটারে চালানো উচিত কিনা তা নির্ধারণ করতে। সুতরাং, আমি প্রতিটি কমান্ড চলমান সময় পূর্বাভাস করছি। আউটপুটটি দেখে মনে হচ্ছে:

process1    00:03:34
process2    00:00:35
process3    00:12:34

মোট চলমান সময় পেতে আমি কীভাবে দ্বিতীয় কলামটি যোগ করতে পারি? আমি প্রতিটি লাইন মাধ্যমে পাইপ চেষ্টা করতে পারে

awk '{sum += $2 } END { print sum }

মানগুলি প্রাকৃতিক সংখ্যা নয় বলে এটির কোনও অর্থ নেই।

উত্তর:


15
#!/bin/sh

EPOCH='jan 1 1970'
sum=0

for i in 00:03:34 00:00:35 00:12:34
do
  sum="$(date -u -d "$EPOCH $i" +%s) + $sum"
done
echo $sum|bc

date -u -d "jan 1 1970" +%s0 date -u -d "jan 1 1970 00:03:34" +%sদেয়। সুতরাং 214 সেকেন্ড দেয়।


একটু হ্যাক-ওয়াই মনে হচ্ছে তবে হেই, এটি একটি আকর্ষণীয় (সাজানোর) উপায়ে কাজ করে।
hjk

4

ধরুন আপনি বাশ 'টাইম' বিল্টিন কমান্ডটি ব্যবহার করছেন আপনি আপনার প্রোগ্রামটি চালানোর আগে, আপনি পারেন export TIMEFORMAT=%0R। এরপরে আউটপুট পুরো সেকেন্ডে awk দ্বারা যুক্তযোগ্য হবে। ব্যাশ ম্যান পৃষ্ঠার 'শেল ভেরিয়েবলস' বিভাগে আরও তথ্য পাওয়া যায়।


4

আপনি যদি TIMEFORMATসময়টি সেকেন্ডে স্থানান্তর করতে চান না (বা চান না) তবে এটি একসাথে যুক্ত করুন। উদাহরণস্বরূপ পাইপ আউটপুট মাধ্যমে:

{                                           
sum=0
while IFS="[ :]" proc_name h m s
do
    let sum+=$((60*($m+60*$h)+$s)) 
done 
echo $sum  
} 

অথবা আপনি চাইলে সর্বশেষ- echoকম্যান্ডের মাধ্যমে বিনিময় করতে পারেন

printf "%02d:%02d:%02d\n" $[sum/3600] $[sum/60] $[sum%60]

কয়েক মিনিট $[sum/60%60]সময় বন্ধ করা উচিত।
জেসি চিশলম

3

হালনাগাদ:

এখানে একটি নতুন বাস্তবায়ন রয়েছে যা 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 -En -e 's/^.*([0-9][0-9]):([0-9][0-9]):([0-9][0-9]).*$/\1 \2 \3/p'

আমি ওওকের সাথে যাব এবং trএটি সহজ। উপরের কমান্ডের যে কোনওটি নীচের বিন্যাসে একটি পরিষ্কার আউটপুট উত্পাদন করে। (আমি আমার নিজস্ব পাঠ্যটি ব্যবহার করছি কারণ আমি এটিকে আরও আকর্ষণীয় মনে করি; এতে কয়েক ঘন্টা অন্তর্ভুক্ত রয়েছে rs আপনার কাজগুলিও কাজ করবে))

$ 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 

ফলাফলটি সেকেন্ড, মিনিট, ঘন্টা হবে ence (দ্রষ্টব্য এটি একটি বিপরীত ক্রম।) আমি কেবল শিখছি 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
$ 

2

এখানে আমার সমাধান - ব্যবহার split()। সেকেন্ডে মোট সময় মুদ্রণ:

awk '{
        split($2, tm, ":");
        tottm += tm[3] + tm[2] * 60 + tm[1] * 3600;
    }
    END {
        print tottm;
    }' ptime

সুন্দর সময় বিন্যাসে মুদ্রণ:

awk '{
        split($2, tm, ":");
        secs += tm[3]; 
        mins += tm[2] + int(secs / 60); 
        hrs += tm[1] + int(mins / 60);
        secs %= 60; mins %= 60;
    }
    END {
        printf "%d:%d:%d\n", hrs, mins, secs;
    }' ptime

জিএনইউ অ্যাজকিও স্ট্রফটাইম সমর্থন করে তবে এটি আপনার বর্তমান টাইমজোনটি ব্যবহার করবে, সুতরাং ফলাফল বিভ্রান্তিকর হবে।


আপনি কল করতে পারেন gawkসঙ্গে TZ=UTC0 gawk...সময় অঞ্চল ইস্যু মুছে ফেলার জন্য।
স্টাফেন চেজেলাস


0

এখানে থিমগুলিতে পার্থক্য রয়েছে তবে আরও পাইপ রয়েছে

echo """
process1    00:03:34
process2    00:00:35
process3    00:12:34
"""  | \
     sed 's/process.  *\([0-9]\)/\1/g' | \
     xargs -i{} date +%s --date "1970-1-1 {}" | \
     awk '{sum += $1; cnt +=1} 
         END {
               print sum / 60, " total minutes processing";
               print (sum / 3600) / cnt, "minutes per job"
         }'
916.717  total minutes processing
5.09287 minutes per job

0

প্রায় কোনও শেল গণিত করতে পারে:

#!/bin/sh

IFS=:; set +f
getseconds(){ echo "$(( ($1*60+$2)*60+$3 ))"; }

for   t in 00:03:34 00:00:35 00:12:34
do    sum=$((sum + $(getseconds $t) ))
done
printf '%s\n' "$sum"

getseconds $=tএটি বিভাজন পেতে zsh ব্যবহার করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.