Adding a List of Times


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Adding a List of Times
# 1  
Old 09-08-2016
Adding a List of Times

Hey gang, I have a list of times I need to sum up. This list can vary from a few to a few thousand entries. Now I had found a closed reference to adding time titled "add up time with xx:yy format in bash how?" In it, the example works great for that formatted list of times... This is the reply code from user AGAMA in that thread:

Code:
list="1:11 0:13 2:06 1:38 1:36 0:06 0:31 0:33 0:38 0:44"

h=0
m=0
for x in ${list}
do
    h=$(( h + ${x%%:*} ))   # add hours and minutes
    m=$(( m + ${x##*:} ))
done

h=$(( h + (m /60) ))    # minutes are likely more than 60, calc hours and add in 
m=$(( m % 60 ))     # adjust minutes

echo "${h}hrs ${m}min

"

BUT what I'm getting hung up on is how would I introduce the third parameter of seconds to this, if my times had the three columns?

I'm not quite verse enough in scripting to understand the formatting of the read in the 'do' loop. Are the '%' and '#' arbitrary or necessary for what they're representing?

In the other thread Agama tries to explain parameter expansion in a latter reply, but try as I may, I'm not wrapping my shrunken brain around this. I do need a bit of assistance trying to figure it out and adding in the seconds to tally up.

Thank you.
# 2  
Old 09-09-2016
Maybe something more like:
Code:
#!/bin/ksh
list="1:11:59 0:13:58 2:06:57 1:38:56 1:36:55 0:06:54 0:31:53 0:33:52 0:38:51 0:44:50"

h=0
m=0
s=0
while IFS=':' read H M S
do
    h=$(( h + H ))   # add hours, minutes, and seconds
    m=$(( m + M ))
    s=$(( s + S ))
done <<-EOF
	$(printf '%s\n' $list)
EOF

m=$(( m + (s / 60) ))	# Add seconds overflow into minutes.
s=$(( s % 60 ))		# Remove whole minutes from seconds.

h=$(( h + (m / 60) ))	# Add minutes overflow into hours.
m=$(( m % 60 ))		# Remove whole hours from minutes.

printf '%d:%02d:%02d\n' "$h" "$m" "$s"

which produces the output:
Code:
9:25:05

These 2 Users Gave Thanks to Don Cragun For This Post:
# 3  
Old 09-09-2016
Code:
#!/bin/bash

list="1:11:00 0:13:03 2:06:45"

h=0
m=0
s=0
for x in ${list}
do
        echo ${x}
        h=$(( h + ${x%%:*} ))
        Min=$(echo ${x%:*} | cut -d: -f2)
        m=$(( m + ${Min} ))
        s=$(( s + ${x##*:} ))
        #echo "H : ${h}"
        #echo "M : ${m}"
        #echo "S : ${s}"
done

m=$(( m + (s/60) ))
h=$(( h + (m/60) ))
m=$(( m % 60 ))
s=$(( s % 60 ))

echo "${h}hrs ${m}min ${s}sec

This User Gave Thanks to itkamaraj For This Post:
# 4  
Old 09-09-2016
Note that I used a Korn shell in post #2 and itkamaraj used bash in post #3. If you use bash, you will need to strip leading zeros from minutes and seconds values 08 and 09. The Korn shell treats those strings as decimal 8 and 9, respectively; but bash treats them as invalid octal numbers.

You can also do this just using variable expansions without resorting to using cut to extract the minutes with something more like:
Code:
#!/bin/bash

list="1:51:59 0:33:08 2:06:41"

h=0
m=0
s=0
for x in ${list}
do
        echo ${x}
	S=${x##*:}	# Extract seconds.
	x=${x%:$S}	# Strip seconds from x.
	S=${S#0}	# Strip leading 0 from S.

	M=${x##*:}	# Extract minutes.
	M=${M#0}	# Strip leading 0 from M.

	H=${x%:*}	# Extract hours (assume there is no leading 0 here.

        h=$(( h + H ))
        m=$(( m + M ))
        s=$(( s + S ))
        #echo "H : ${h}"
        #echo "M : ${m}"
        #echo "S : ${s}"
done

m=$(( m + (s/60) ))
h=$(( h + (m/60) ))
m=$(( m % 60 ))
s=$(( s % 60 ))

echo "${h}hrs ${m}min ${s}sec"

which produces the following output when run with either bash or ksh:
Code:
1:51:59
0:33:08
2:06:41
4hrs 31min 48sec

Note that I modified the time values in $list to provoke bash complaints with bad octal values. If we change the code in post #3 to use the above list (and add the missing " at the end of the echo statement on the last line), we get the output:
Code:
1:51:59
0:33:08
script_name: line 14: s + 08: value too great for base (error token is "08")
2hrs 24min 59sec

These 3 Users Gave Thanks to Don Cragun For This Post:
# 5  
Old 09-09-2016
Hi.

The dateutils suite contains a code that can add date/time durations: dadd. However, the format of the durations needs to be not in a form like 1:51:59, but rather 1h51m59s. That can be done with a little pipeline, and then presented to dadd, like so:
Code:
#!/usr/bin/env bash

# @(#) s1       Demonstrate addition of a list of times, dateutils.dadd

# Utility functions: print-as-echo, print-line-with-visual-space, debug.
# export PATH="/usr/local/bin:/usr/bin:/bin"
LC_ALL=C ; LANG=C ; export LC_ALL LANG
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
em() { pe "$*" >&2 ; }
db() { ( printf " db, ";for _i;do printf "%s" "$_i";done;printf "\n" ) >&2 ; }
db() { : ; }
C=$HOME/bin/context && [ -f $C ] && $C dateutils.dadd

list="1:11:59 0:13:58 2:06:57 1:38:56 1:36:55 0:06:54 0:31:53 0:33:52 0:38:51 0:44:50"

pl " Input data list:"
pe "$list"

pl " Input list modified:"
v1=$( echo "$list" |
tr ' ' '\n' |
sed 's/:/h/;s/:/m/;s/$/s/' |
tr '\n' ' ')
echo "$v1"

pl " Results:"
dateutils.dadd -f "%T" 00:00:00 $v1 

exit 0

producing:
Code:
$ ./s1

Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64
Distribution        : Debian 8.4 (jessie) 
bash GNU bash 4.3.30
dateutils.dadd dadd 0.3.1

-----
 Input data list:
1:11:59 0:13:58 2:06:57 1:38:56 1:36:55 0:06:54 0:31:53 0:33:52 0:38:51 0:44:50

-----
 Input list modified:
1h11m59s 0h13m58s 2h06m57s 1h38m56s 1h36m55s 0h06m54s 0h31m53s 0h33m52s 0h38m51s 0h44m50s 

-----
 Results:
09:25:05

The dateutils suite can be found at dateutils, and in repositories for ArchLinux, Debian, Fedora, FreeBSD, Gentoo, NetBSD, OpenSuSE, OS, Slackware, Ubuntu

Best wishes ... cheers, drl
This User Gave Thanks to drl For This Post:
# 6  
Old 09-09-2016
Gang, this does put things in a better light in my brain...
Don... yes, I am using KSH...
But seeing this same problem solved in multiple ways helps me grasp the entire processing concept.
And now I do have a running process that's cranking out and summing up time numbers. But if I am stuck in another shell or environment, well, now I have these other options also.
Thank you very much for your time gang!
Bruce
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Adding Long List Of Large Numbers

Hi All, I have a file with long list of numbers. This file contains only one column. These numbers are very large. I am using following command: cat myfile.txt | awk '{ sum+=$1} END {print sum}' The output is coming in scientific notation. How do I get the result in proper format? ... (4 Replies)
Discussion started by: angshuman
4 Replies

2. Solaris

PostgreSQL - Adding to SVCS list.

I'm having some troubles setting an instance of postgreSQL to automatically start upon system boot. I have two servers running this app, one is automatically starting the service, the other is not. I'm attempting to use the "svcadmin" command, however, apparently when I run a "svcs -a" search, the... (6 Replies)
Discussion started by: Nvizn
6 Replies

3. Shell Programming and Scripting

AWK adding prefix/suffix to list of strings

75 103 131 133 138 183 197 221 232 234 248 256 286 342 368 389 463 499 524 538 (5 Replies)
Discussion started by: chrisjorg
5 Replies

4. Programming

Problem with implementing the times() function in C (struct tms times return zero/negative values)

Hello, i'm trying to implement the times() function and i'm programming in C. I'm using the "struct tms" structure which consists of the fields: The tms_utime structure member is the CPU time charged for the execution of user instructions of the calling process. The tms_stime structure... (1 Reply)
Discussion started by: g_p
1 Replies

5. Shell Programming and Scripting

Adding Characters to a Word List

If I had a word list with a large amount of words in it, how would I (using a unix command) add, say, 123 to the end of each word? EDIT: The word list is stored in a large text file. I need a command that applies the ending to each word in the file and saves the result in a new text file. (7 Replies)
Discussion started by: evillion
7 Replies

6. Shell Programming and Scripting

Need scripting help in :Adding 20% to a list of number :

Hi Experts, I want to add 20% to the values and get an output , please advise with script , awk etc, # cat datafile.txt 50.4053 278.383 258.164 198.743 4657.66 12.7441 646.787 1.56836 23.2969 191.805 53.3096 1.12988 999.058 4100.29 (2 Replies)
Discussion started by: rveri
2 Replies

7. Shell Programming and Scripting

adding a list of numbers 3 by 3

i have a list of numbers like this; 124 235 764 782 765 451 983 909 ... and i want to make a sum with the first 3 of them then the next 3 and so on. 124+235+764=1123 782+765+451=1998 ... some ideas? (4 Replies)
Discussion started by: Tártaro
4 Replies

8. Shell Programming and Scripting

Selecting certain times from a list

Hi all, I have a list of times: ...10:02 15:34 20:05 01:51 06:55 09:00 05:52... That's just part of the list (its huge). How do I go about selecting certain times, e.g. just between 23:00 and 05:00 ?? (4 Replies)
Discussion started by: mikejreading
4 Replies

9. UNIX for Dummies Questions & Answers

User Name and Password List/adding and removing users.

Hello everyone and let me start off by thanking anyone who can help with this. I work for a company that uses Unix as one of their servers. I'm not at all familar with Unix beyond logging after I restart the server:rolleyes: I'm looking for some command that will bring me up a list of current... (3 Replies)
Discussion started by: disgracedsaint
3 Replies

10. AIX

how would you know your server was rebooted 3 times or 5 times

Is there such location or command to know how many times did you reboot your server in that particular day?in AIX. (3 Replies)
Discussion started by: kenshinhimura
3 Replies
Login or Register to Ask a Question

Featured Tech Videos