Time Manipulations


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Time Manipulations
# 1  
Old 07-13-2005
Time Manipulations

Hi All Smilie
I have a long file having different fields like :-
hh:mm:ss seconds
14:15:56 120
14:18:36 12
15:12:36 1500
I want to subtract the hh:mm:ss in line(2) from hh:mm:ss in line(1) & compare the output of substraction (obtained in seconds) with the seconds in line(1) and echo whether it is greater than seconds(120). I want the process to repeat for the whole file as in excel we copy the formula down the column. I tried the command
nawk '{printf (substr($0,1,2)...........}' to seperate the hh:mm:ss as
14 15 56 120
14 18 36 12
15 12 36 1500
then using command
nawk '{print ($1*3600+$2*60+$3)-prev;prev=($1*3600+$2*60+$3) }' <file>
I got the result the result as:
51356
160
3240, all value in seconds.
The problem is that I am unable to compare the 160sec with 120 sec and echo the result & loop the process ie compare 3240 sec with 12 sec & so on.
Can u help me out.
Thanks in Advance.
# 2  
Old 07-13-2005
Got a rather roundabout script to do the job:

Code:
#!/bin/sh
#set -x
line=`head -1 test.tmp`
sec1=`echo $line | cut -d' ' -f2`
hms1=`echo $line | cut -d' ' -f1|awk -F':' '{print $1*3600+$2*60+$3}'`
tail +2 test.tmp | while read line; do
        sec2=`echo $line | cut -d' ' -f2`
        hms2=`echo $line | cut -d' ' -f1|awk -F':' '{print $1*3600+$2*60+$3}'`
        secint=`expr $sec1 - $sec2`
        if [ $hms1 -gt $secint ]; then
                echo "hh:mm:ss subtraction is greater than seconds"
        else
                echo "hh:mm:ss subtraction is less than / equal to seconds"
        fi
        sec1=$sec2; hms1=$hms2
done

test.tmp is the file that holds the data. It is assumed to be present in the same directory as the script.

I am sure that there is some way in awk that you could do this in less than half the number of lines. But unfortunately, my knowledge of awk leaves much to be desired.

Last edited by blowtorch; 07-13-2005 at 04:07 PM..
# 3  
Old 07-13-2005
here's the awk way:

nawk -f vana.awk myFile.txt

vana.awk:
Code:
BEGIN {
  FStime=":"
  multN=split("3600 60 1", mult, " ");
}
{
  n=split($1, timeA, FStime)
  for(i=1; i <= n; i++)
   time += timeA[i] * mult[i]
  diff = $2
}
FNR == 1 {
  prevTime=time;
  prevDiff=diff
  next;
}
{
  printf("%s\n", ( ( time - prevTime) > prevDiff ) ? "greater" : "notGreater")
  prevTime=time; prevDiff=diff
}

# 4  
Old 07-16-2005
Quote:
Originally Posted by blowtorch
Got a rather roundabout script to do the job:

Code:
#!/bin/sh
#set -x
line=`head -1 test.tmp`
sec1=`echo $line | cut -d' ' -f2`
hms1=`echo $line | cut -d' ' -f1|awk -F':' '{print $1*3600+$2*60+$3}'`
tail +2 test.tmp | while read line; do
        sec2=`echo $line | cut -d' ' -f2`
        hms2=`echo $line | cut -d' ' -f1|awk -F':' '{print $1*3600+$2*60+$3}'`
        secint=`expr $sec1 - $sec2`
        if [ $hms1 -gt $secint ]; then
                echo "hh:mm:ss subtraction is greater than seconds"
        else
                echo "hh:mm:ss subtraction is less than / equal to seconds"
        fi
        sec1=$sec2; hms1=$hms2
done

test.tmp is the file that holds the data. It is assumed to be present in the same directory as the script.

I am sure that there is some way in awk that you could do this in less than half the number of lines. But unfortunately, my knowledge of awk leaves much to be desired.
Hi Friend
Thanks for the reply
I tried the your script & made changes according to my need as under :
line=`head -1 test.tmp`
sec1=`echo $line | cut -d' ' -f5`
hms1=`echo $line | cut -d' ' -f4|awk -F':' '{print $1*3600+$2*60+$3}'`
tail +2 test.tmp |while read line;do
sec2=`echo $line | cut -d' ' -f5`
hms2=`echo $line | cut -d' ' -f4|awk -F':' '{print $1*3600+$2*60+$3}'`
secint=`expr $hms2 - $hms1`
if [ $secint -gt $sec1 ]; then
awk '{print $0,"pk"}'
else
awk '{print $0,"W"}'
fi
sec1=$sec2; hms1=$hms2
done

but it gives some problems
1) It does not output the first two lines. Rest of lines are printed with out any comparision made (might loop not working properly)
2) Rest of line printed reflect the comparision made for first two lines.
e.g. all lines either contains the character pk or W.
Please Help.
# 5  
Old 07-16-2005
MySQL

Good code, vgersh. I think you forgot to reset time before the loop.
Quote:
Originally Posted by vgersh99
Code:
{
  n=split($1, timeA, FStime)
  time = 0
  for(i=1; i <= n; i++)
   time += timeA[i] * mult[i]
  diff = $2
}

Your code is so attractive, I couldn't resist stripping it.
Code:
BEGIN {
  split("3600 60 1", mult)
  FS=":| "
}
{ time = 0
  for (i=1; i < 4; i++)
    time += $i * mult[i]
  diff = $4
}
FNR == 1 {
  prevTime = time
  prevDiff = diff
  next
}
{ print ( ( time - prevTime) > prevDiff ) ? "greater" : "notGreater"
  prevTime=time; prevDiff=diff
}

# 6  
Old 07-16-2005
Quote:
Originally Posted by futurelet
Good code, vgersh. I think you forgot to reset time before the loop.
good catch - thanks.

Welcome to unix.com, futurelet - glad to see you here!
# 7  
Old 07-19-2005
Quote:
Originally Posted by vanand420
Hi All Smilie
I have a long file having different fields like :-
hh:mm:ss seconds
14:15:56 120
14:18:36 12
15:12:36 1500
I want to subtract the hh:mm:ss in line(2) from hh:mm:ss in line(1) & compare the output of substraction (obtained in seconds) with the seconds in line(1) and echo whether it is greater than seconds(120). I want the process to repeat for the whole file as in excel we copy the formula down the column. I tried the command
nawk '{printf (substr($0,1,2)...........}' to seperate the hh:mm:ss as
14 15 56 120
14 18 36 12
15 12 36 1500
then using command
nawk '{print ($1*3600+$2*60+$3)-prev;prev=($1*3600+$2*60+$3) }' <file>
I got the result the result as:
51356
160
3240, all value in seconds.
The problem is that I am unable to compare the 160sec with 120 sec and echo the result & loop the process ie compare 3240 sec with 12 sec & so on.
Can u help me out.
Thanks in Advance.


Hi Friends
Thanks for the reply
I tried the your script & made changes according to my need as under :
line=`head -1 test.tmp`
sec1=`echo $line | cut -d' ' -f5`
hms1=`echo $line | cut -d' ' -f4|awk -F':' '{print $1*3600+$2*60+$3}'`
tail +2 test.tmp |while read line;do
sec2=`echo $line | cut -d' ' -f5`
hms2=`echo $line | cut -d' ' -f4|awk -F':' '{print $1*3600+$2*60+$3}'`
secint=`expr $hms2 - $hms1`
if [ $secint -gt $sec1 ]; then
awk '{print $0,"pk"}'
else
awk '{print $0,"W"}'
fi
sec1=$sec2; hms1=$hms2
done

but it gives some problems
1) It does not output the first two lines. Rest of lines are printed with out any comparision made (might loop not working properly)
2) Rest of line printed reflect the comparision made for the first two lines.
e.g. all lines either contains the character pk or W.
Please rectify the errors in script and help me out.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Text file manipulations

Hello All, I have three txt files ***main.txt***** code test line code test3 asdfasdf do for while line1: code test line code test3 asdfasdf do for while line2: code test (6 Replies)
Discussion started by: avatar_007
6 Replies

2. UNIX for Dummies Questions & Answers

Help with Multiple Text Manipulations

Hey guys, I have a file which contains 22,373 ping trace outputs which I generated using a script I made, see excerpt below: ... PING6(72=40+8+24 bytes) 2001:630:301:1453:219:e3ff:fee7:8c2a --> 2406:8000:101:c020::24 32 bytes from 2406:8000:101:c020::24, icmp_seq=0 hlim=44 time=279.163 ms... (6 Replies)
Discussion started by: churchill
6 Replies

3. Shell Programming and Scripting

Some manipulations with files and folders. (loop, find, create and remove)

Hello! I need to realize such task. 1. In my user's home dir I have folder1; 2. In folder1 I have some (various count) subfolders with random names; 3. In these subfolders I have one file anyname.pdf (various name in each subfolder) and file content.txt (constant name in each subfolder) ##... (7 Replies)
Discussion started by: optik77
7 Replies

4. Shell Programming and Scripting

Time and Date Manipulations

Hi Guys... I do have a script that I need to use time or time function in my condition. The logic will be like if the current time of execution is between 7am and 7pm then do 1,2,3,etc else do 4,5,6. I need help is that function or how best can I do this. Thanks in advance. Please... (3 Replies)
Discussion started by: Phuti
3 Replies

5. Shell Programming and Scripting

File Manipulations

Hi All, I have a pipe delimited file with around 30 fields. What is the simple way to Update a value for any column. For ex. If i want to update 22 field with "album". Similarly, how to do this for the whole file and selective records of the file. Example file contents: ... (5 Replies)
Discussion started by: Joe2226
5 Replies

6. Shell Programming and Scripting

How to do String manipulations using Substring function in Shell

Hi, I have a scenario to just plug out the file name from the following location path. /opt/project/data/int/holdFiles/csv195687.csv So, how do I get just file name which is "csv195687.csv" from the above line using awk/shell scripting? Can we use indexOf and Substring in awk to get... (7 Replies)
Discussion started by: anilvvnn
7 Replies

7. Shell Programming and Scripting

Convert Epoch Time to Standard Date and Time & Vice Versa

Hi guys, I know that this topic has been discuss numerous times, and I have search the net and this forum for it. However, non able to address the problem I faced so far. I am on Solaris Platform and unable to install additional packages like the GNU date and gawk to make use of their... (5 Replies)
Discussion started by: DrivesMeCrazy
5 Replies

8. UNIX for Advanced & Expert Users

How To Provide Time Sync Using Nts-150 Time Server On Unix Network?

can anybody tel lme,how to instal NTS -150 on a unix network,it needs some patch to fetch time frm serve,,?? (2 Replies)
Discussion started by: pesty
2 Replies

9. UNIX for Advanced & Expert Users

Date manipulations

hi i am having a script in which i am supposed to extract data for three different dates...first date is current date second date is 15 days back third date is 40 days back for eg consider todays date 26062006 as first date then second date is 11062006 third date is 17052006 now in my... (2 Replies)
Discussion started by: rochitsharma
2 Replies

10. Shell Programming and Scripting

date manipulations

i need a date manipulation unix shell script, to find the difference between any two dates. kindly help me:confused: (2 Replies)
Discussion started by: user1
2 Replies
Login or Register to Ask a Question