Find time difference between two consecutive lines in same file.


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Find time difference between two consecutive lines in same file.
# 1  
Old 03-11-2011
Question Find time difference between two consecutive lines in same file.

Hello
I have a file in following format:

IV 08:09:07
NM 08:12:01
IC 08:12:00
MN 08:14:20
NM 08:14:15

I need a script to compare time on each line with previous line and show the inconsecutive line. Ex.:
08:12:00
08:14:15

A better way will be a message in this form:
“IC has 1 second difference on 08:12:00 time
NM has 5 second difference on 08:14:15 time”
But first example will be more than enough.

How i can compare each line whit previews line? I tried this script:

Code:
 
  cat myfile|gawk '{print $2}'>tempfile
   while read line
    do
    PAST=$line -1 ****** someheting similar here
    DIFF=$(($PAST-$LINE))
   echo $line $DIFF
  done<tempfile

but it doesn’t work in line 3. Is a syntax problem or is an impossible command. I don’t know. I’m new in this. I even try to make a variable name, variable but again I’m stuck in line 3 on syntax or in “impossibliness” problem:


Code:
    while read line ;do
     for ((  i = 1 ;  i <= 5;  i++  ))
      PAST${!i}=$line   **********!!!????
      DIFF=$(($PAST${!i}-$(($PAST${!i-1}))
   echo $DIFF
   done
  done < tempfile

It must be an “eval” expression somewhere but “indirect variable reference” is way over my head right now. I have a felling that all can be done very easily but I can’t see how Smilie.
Thanks in advance for your time.

Last edited by vilibit; 03-11-2011 at 08:10 AM..
# 2  
Old 03-11-2011
Your requirment and/or data sample are not very clear, however base you your post I can provide this solution
Code:
# cat file
IV 08:09:07
NM 08:12:01
IC 08:12:00
MN 08:14:20
NM 08:14:15

# awk 'function s(x){split($NF,t,":");return t[1]*60^2+t[2]*60+t[3]}{cur=s($NF);if(prev){diff=cur-prev};prev=cur;if(diff<0){print $1" has "diff*-1" second difference on "$NF}}' file
IC has 1 second difference on 08:12:00
NM has 5 second difference on 08:14:15

# 3  
Old 03-11-2011
if you need a plain ksh example of a utility script, you could do the following:-

Code:
#!/bin/ksh
#timediff - A simple time difference routine
#Requires input of two times (format hh:mm:ss) on command line or will prompt.
#
#Author:- Robin

if [ $# -eq 2 -o $# -eq 3 ]
then
   stime=$1                      # Start time
   etime=$2                      # End time
else
   read stime?"Please enter the start time: "
   read etime?"Please enter the end time: "
   read response?"Respond in hh:mm:ss or seconds? (h/S)"
   typeset -l response
   if [ "$response" = "h" ]
   then
      set - "" "" hh:mm:ss       # Force parm 3 to be hh:mm:ss for later
   fi
   echo "The difference is: \c"  # Write a tag just for interactive use
fi

echo $stime|tr ":" " "|read shh smm sss        # Split the time up
echo $etime|tr ":" " "|read ehh emm ess

((shhs=$shh*3600))
((ehhs=$ehh*3600))
((smms=$smm*60))
((emms=$emm*60))

((ssecs=$shhs+$smms+$sss))
((esecs=$ehhs+$emms+$ess))

((delta=$esecs-$ssecs))
if [ $delta -lt 0 ]                # Is difference negative, i.e. we're past midnight
then
   ((delta=$delta+86400))          # Add a day's worth of seconds
fi

if [ "$3" = "hh:mm:ss" ]           # is parm 3 set to request formatted output
then
   typeset -Z2 dhh dmm dss
   ((dhh=$delta/3600))               # Use integer match to get whole hours
   ((delta=$delta-(3600*$dhh)))  # Take off enough seconds to compensate
   ((dmm=$delta/60))            # use integer matsh to get whole minutes
   ((dss=$delta-(60*$dmm)))  # Take off enough seconds to compensate
   echo "$dhh:$dmm:$dss"
else
   echo $delta           # Show total seconds difference
fi

It takes either zero, two or three parameters. With zero, it prompts. With two, it gives the difference in seconds. If parameter 3 is hh:mm:ss then it converts it back to time format.

You can then decide how you want your code to call it, for instance a very simple:-
Code:
#!/bin/ksh
preval=""

cat myfile |while read label val
do
   if $preval != "" ]
   then
      echo "$label is after `timediff $preval $val`"
      preval=$val
   fi
done

You could, of course add the 3rd parameter to the call to timediff of hh:mm:ss amking the line:
Code:
echo "$label is after `timediff $preval $val hh:mm:ss`"

As a warning, I have just thrown this together, so I haven't worried about considering crossing over midnight more than once in a single step.



I hope that this helps, but do let us know if I have missed the point.




Robin
Liverpool/Blackburn
UK

Last edited by rbatte1; 03-11-2011 at 10:22 AM.. Reason: Adding comments and a calling loop
# 4  
Old 03-11-2011
Thanks for reply. It is a very elaborate response. I'm eager to try your solutions. Unfortunately all my testing data are at work. I will test your script Monday and I will keep you posted. Thanks again.
# 5  
Old 03-14-2011
MySQL Problem solved

I promised to get back with results.
The danmero solution is working charmingly, although I'm not fully understand how it read previous line and compare with current one. The data from my file are several lines long and script pointed me exactly where to look for differences. Thanks again danmero, this is exactly what I need.
Although is not exactly what I intended to obtain, I tested the rbatte1 solution and after choosing h or S option I get an error:


Code:
Please enter the start time: 08:09:10
Please enter the end time: 08:09:20
Respond in hh:mm:ss or seconds? (h/S)S
The difference is: ./rba[26]: shhs=*3600: unexpected `*'
./rba[27]: ehhs=*3600: unexpected `*'
./rba[28]: smms=*60: unexpected `*'
./rba[29]: emms=*60: unexpected `*'
0

Probably becouse i use bash which i must be mentioned earlyer. Sorry.
Thanks again for your time. My problem was solved Smilie
# 6  
Old 03-14-2011
Ahh. I wrote for ksh. What input did you supply? I will have a go at converting.
# 7  
Old 03-14-2011
The input was hh:mm:ss format.
In this case the start time was 08:09:10 and the end time was 08:09:20
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

find pattern matches in consecutive lines in certain fields-awk

I have a text file with many thousands of lines, a small sample of which looks like this: InputFile:PS002,003 D -1 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 6 6 -1 -1 -1 -1 0 509 0 PS002,003 PSQ 0 1 7 18 1 0 -1 1 1 3 -1 -1 ... (5 Replies)
Discussion started by: jvoot
5 Replies

2. Shell Programming and Scripting

Calculate time difference between two lines

i grepped the time stamp in a file as given below now i need to calculate time difference file data: 18:29:10 22:15:50 (5 Replies)
Discussion started by: vivekn
5 Replies

3. Shell Programming and Scripting

Check/Parse log file's lines using time difference/timestamp

I was looking at this script which outputs the two lines which differs less than one sec. #!/usr/bin/perl -w use strict; use warnings; use Time::Local; use constant SEC_MILIC => 1000; my $file='infile'; ## Open for reading argument file. open my $fh, "<", $file or die "Cannot... (1 Reply)
Discussion started by: cele_82
1 Replies

4. Shell Programming and Scripting

Get the time difference between two consecutive line in UNIX perl script

Hi All :o, I have some log files which contains these informations: 2013-04-24 09:11:34.018 INFO XXXXXXXXXXXX 2013-04-24 09:11:34.029 INFO YYYYYYYYYYYY 2013-04-24 09:11:34.039 INFO ZZZZZZZZZZZZZZZ 2013-04-24 09:12:21.295 INFO TTTTTTTTTTTTTTT 2013-04-24 09:12:21.489 INFO... (3 Replies)
Discussion started by: shariquehabib
3 Replies

5. UNIX for Dummies Questions & Answers

Find time difference

I have a file wich contains time formats and i need to get the time difference TIME1 TIME2 =============== =================== 20120624192555.6Z 20120624204006.5Z which means first date 2012/6/24 19:25:55,second date 2012/6/24 20:40:06 so when i get the time... (23 Replies)
Discussion started by: wnaguib
23 Replies

6. Shell Programming and Scripting

How to find time difference?

I have a file wich contains time formats and i need to get the time difference TIME1 TIME2 ================================== 20120624192555.6Z 20120624204006.5Z which means first date 2012/6/24 19:25:55,second date 2012/6/24 20:40:06 so when i get the time... (1 Reply)
Discussion started by: wnaguib
1 Replies

7. Shell Programming and Scripting

how to delete two consecutive lines from the file

Hi guys I am deleting a unique line from the file and also need to remove the line above it which is NOT unique and servers as a record separator. Here is an example: # 101 803E 823F 8240 # 102 755f 4F2A 4F2B # 290 747D 0926 0927 # 999 8123 813E ... (5 Replies)
Discussion started by: aoussenko
5 Replies

8. Shell Programming and Scripting

Calculate difference between consecutive data points in a column from a file

Hi, I have a file with one column data (sample below) and I am trying to write a shell script to calculate the difference between consecutive data valuse i.e Var = Ni -N(i-1) 0.3141 -3.6595 0.9171 5.2001 3.5331 3.7022 -6.1087 -5.1039 -9.8144 1.6516 -2.725 3.982 7.769 8.88 (5 Replies)
Discussion started by: malandisa
5 Replies

9. Shell Programming and Scripting

Help to find the time difference between the lines

Hi guru's, Am new to shell scripting. I am getting the below o/p from the oracle database, when I fire a query. ID JOB_ID ELAPSED_TIME FROM TO ----- ------ ------------------- -------- -------- 62663 11773 01/06/2009 09:49:13 SA CM 62664 11773 ... (4 Replies)
Discussion started by: sathik
4 Replies

10. Shell Programming and Scripting

To find the time difference between two lines of the same log file

Hello Friends, I want to write a script for the following: nlscux62:tibprod> grep "2008 Apr 30 01:" SA_EHV_SPEED_SFC_IN_03-SA_EHV_SPEED_SFC_IN_03-2.log | grep -i post | more 2008 Apr 30 01:01:23:928 GMT +2 SAPAdapter.SA_EHV_SPEED_SFC_IN_03-SA_EHV_SPEED_SFC_IN_03-2 Info AER3-000095 IDOC... (2 Replies)
Discussion started by: satyakam
2 Replies
Login or Register to Ask a Question