Helpm with time function


 
Thread Tools Search this Thread
Homework and Emergencies Homework & Coursework Questions Helpm with time function
# 1  
Old 12-23-2016
Helpm with time function

I want to print the difference (in days) between ($7) and the oldest record date ($6) based on unique ID ($5) on a new field. In addition, I want to subtract oldest date from recent dates(in days) ($6) for each unique ID ($5).

Here is the data looks like
Code:
 7  81  1    47  32070  2010-12-14    20101009  
 7  82  2    10  41920  2010-12-14    20100724  
 7  83  1    67  29446  2010-12-14    20101118   
 7  81  1    47  32070  2011-5-11     20101009     
 7  83  1    67  29446  2011-6-22     20101118     
 7  82  2    10  41920  2011-5-14     20100724

I would like to see as follows
Code:
 7  81  1    47  32070   2010-12-14   20101009     65      147    
 7  82  2    10  41920   2010-12-14   20100724     170     150  
 7  83  1    67  29446   2010-12-14   20101118     26      188  
 7  81  1    47  32070   2011-5-11    20101009      65      147  
 7  83  1    67  29446   2011-6-22    20101118      26      188  
 7  82  2    10  41920   2011-5-14    20100724      170     150​

I have used the following code but doesnt work well. could you help me please.


Code:
BEGIN{
  lastid=0
  lastmilk=0
}
{
   milkyear=substr($6,1,4)
  milkmonth=substr($6,5,2)
  milkday=substr($6,7,2)
  
  startmilksec = mktime(""milkyear" "milkmonth" "milkday"  00")
  endmilk = mktime(""milkyear" "milkmonth" "milkday" 00")
   if(lastid!=$5) 
  {
    printf("%s 0 0 0\n", $0) 
  }
  else
  {
    startmilkdiff=startmilk-lastmilk
    printf("%s %0.f %f %f\n", $0, startmilkdiff) # 
  }
   lastid=$5
  lastmilk=startmilk
}



Moderator's Comments:
Mod Comment Please use CODE tags as required by forum rules!

Last edited by RudiC; 12-23-2016 at 12:04 PM.. Reason: Added CODE tags.
# 2  
Old 12-23-2016
Quote:
...code but doesnt work well.
Sadly, the above doesn't help us diagnose it very well. What output/errors do you get?
Can you get any trace output from/after the mktime function? I think that the date input to mktime is actually a string in the format YYYY MM DD HH MM SS and you don't have all of it, hence I'm wondering if that's where it's going wrong. There is also confusion about all the double quotes.

I also don't see where you are trying to output the days as days. You are displaying the output as the raw difference between two timestamps, which we don't know if they are formatted correctly.

Can you add some printf statements into your code and show us the output from a single input record?



Kind regards,
Robin
# 3  
Old 12-23-2016
Your specification is not too clear, and the code doesn't help understanding nor interpreting .
It is always beneficial to show WHAT exactly "doesn't work well". A few comments that jump to mind looking at your code :
- where is $7 used for computations?
- milkmonth and milkday will not have correct values as the substr parameters are wrong and could be moving.
- lastmilk is undefined for the first line, and not reset if $5 changes. This may be intended behaviour, though.
- endmilk is never used; why not drop it entirely?
- as startmilkdiff is the only variable in the printf stament, three %f format specifiers are redundant.
- as correspondent $5 values are NOT in sequence, you'd better work with arrays, or do a sort beforehand.

EDIT:
- plus, the mktime function requires 6 or 7 parameters; you supply 4 only.
- you want to output the difference in days, but calculate and print second values only.

Last edited by RudiC; 12-23-2016 at 01:15 PM..
# 4  
Old 12-23-2016
the data has a repeated record on different days for the same Id [$5] and i want to print the difference between the oldest and recent record date (in days) [$6] for each unique ID on separate field. In addition, i want to print separately also the difference between field [$7] (which is a date) and the oldest record date of field [$6] for each unique ID. I am struggling to write the command. could you help me in writting the script please.
# 5  
Old 12-24-2016
Want help? Show us your output as your code now produces please.
# 6  
Old 12-24-2016
I need to print the difference (in days) in ($6) between the starting and end date of records for each unique ID ($5) on a new field.

[
Code:
 7  65  2    5   32070  2010-12-14    13:25:30  
 7  82  2    10  41920  2010-12-14    11:30:45
 7  83  1    67  29446  2010-12-14    04:15:25  
 7  81  1    47  32070  2011-5-11      08:14:20
 7  83  1    67  29446  2011-6-22      07:13:24    
 7  82  2    10  41920  2011-5-14      06:15:25

]

I want to see like this:
code:
[
Code:
 7  65  2    5   32070   2010-12-14      13:25:30      65     
 7  82  2    10  41920   2010-12-14      11:30:45     170  
 7  83  1    67  29446   2010-12-14       04:15:25    26   
 7  81  1    47  32070   2011-5-11         08:14:20    65    
 7  83  1    67  29446   2011-6-22         07:13:24    26   
 7  82  2    10  41920   2011-5-14          06:15:25   70

]

Last edited by Scrutinizer; 12-24-2016 at 02:50 PM.. Reason: code tags
# 7  
Old 12-25-2016
This is some awk code. Because you wanted to add days to lines where it could not be calculated, this code is two awk scripts in one bash script. It could be cleaned up.
It adds -1 to lines in error, error being a singleton line.
Code:
$ cat filename && ./t.awk
7  65  2    5   32070  2010-12-14    13:25:30
7  82  2    10  41920  2010-12-14    11:30:45
7  83  1    67  29446  2010-12-14    04:15:25
7  81  1    47  32070  2011-5-11      08:14:20
7  83  1    67  29446  2011-6-22      07:13:24
7  82  2    10  41920  2011-5-14      06:15:25
7  82  2    10  41921  2011-5-14      06:15:25

7  65  2    5   32070  2010-12-14    13:25:30   147
7  82  2    10  41920  2010-12-14    11:30:45 150
7  83  1    67  29446  2010-12-14    04:15:25   189
7  81  1    47  32070  2011-5-11      08:14:20 147
7  83  1    67  29446  2011-6-22      07:13:24     189
7  82  2    10  41920  2011-5-14      06:15:25 150
7  82  2    10  41921  2011-5-14      06:15:25 -1

Code:
# 7  82  2    10  41920  2011-5-14      06:15:25


awk '{
       split($6,arr,"-")
       a=sprintf("%s %s %s 0 0 0",arr[1], arr[2], arr[3])
       d=mktime(a)
       # this is to handle the fact that you want the same data early and late 
       # in the output
       delta[$5]=delta[$5] " " d
     } 
     END {for(i in delta) {print i, delta[i]}  }'  filename > tmp.dat

#    
# display output, print error "-1" if each $5 does not occur twice in the input file
awk '{
      if (FILENAME=="tmp.dat" )
      { 
        delta[$1]=$0; 
        next
      }
      if (FILENAME=="filename")
      { 
        a="-1"  # default is error
        if($5 in delta)
        {
           cnt=split(delta[$5],arr)
           if(cnt==3) # correct number, 1 for $5 two & three are epoch seconds
           {
             a=arr[3] - arr[2]
             a/=86400
             a=int(a)
           }
        }
        print $0, a      
        next
      }
    }' tmp.dat filename   
# note the order of files here is important

This User Gave Thanks to jim mcnamara For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. OS X (Apple)

'time' does NOT work on a function in 'dash'.

Hi guys and gals... I am writing a piece of code that is dash compliant and came across this error. I have put it in the OSX section as that is what I am using. I have no idea what the 'dash' version is but was installed about 6 months ago. MBP, OSX 10.12.6, default terminal running dash on... (4 Replies)
Discussion started by: wisecracker
4 Replies

2. Shell Programming and Scripting

/usr/bin/time Shell Scripting Function

Hello, I have made a Linux Shell Script that downloads 6 files from the Internet and then deletes them. Now i want to use the function "/usr/bin/time" and "bc" to calculate how long the avergate run time for the shell script is. I therefore need to do it 100 times. My shell script code is below: ... (6 Replies)
Discussion started by: solo2
6 Replies

3. Red Hat

lightweight function for measuring time ( better than clock_getime )

HI I have a Red Hat Enterprise with Real Time kernel. Are you aware if there are C functions for this kernel or some code/library for this OS for measuring time more lightweight than clock_gettime and gettimeofday? THe hardware I have is NUMA. Reading forums I found gethrtime but it is... (1 Reply)
Discussion started by: manustone
1 Replies

4. UNIX for Dummies Questions & Answers

time function

hello everybody! i want to post a question. So, I use the command 'time a.out' to time the duration of the program a.out. The return value of this function was: real 0m4.116s user 0m4.112s sys 0m0.016s What i want is! I try to find a way to get (NOT manually) the value of real time.... (2 Replies)
Discussion started by: nicos
2 Replies

5. Shell Programming and Scripting

Unix function to calcuate the difference in time

HI , I need to get the timedifference between two values... which funcation will help eg: difference betweem 19:22 and 19:43 should give 21 mins (2 Replies)
Discussion started by: savitha
2 Replies

6. Shell Programming and Scripting

Nawk Time Function

Hi All, I am using solaris and nawk. Is there any time function in nawk which is simliar to the shell `date` function ? Can any experts show any examples? (4 Replies)
Discussion started by: Raynon
4 Replies

7. Programming

function time

Hello I have problem with function 'time' to test my program for file copying . How to run the function in my source code ? I try something like that: system("time"); < -- but this don't working (2 Replies)
Discussion started by: scotty_123
2 Replies

8. Shell Programming and Scripting

time function

Hi, I would like to display the exact time taken to complete running a particular tool or function or program to user I don't know the exact time functions in unix, please help me thanks in advance Example: $test.ksh output should be The... (10 Replies)
Discussion started by: hsekol
10 Replies

9. Programming

find CPU Time for a function (subsecond precision)

Hi, I need to time a certain function in my C/C++ code and I am experiencing some difficulties. I timed it using wallclock time so I know that it takes approximately 500-600 microseconds with gettimeofday(&start, NULL); // my function call gettimeofday(&end, NULL); answer = (end.tv_sec -... (2 Replies)
Discussion started by: zynnel
2 Replies

10. Programming

C time in milliseconds function.

I need a c function which return the time in: hour min sec and mil sec I am writing on unix os. (3 Replies)
Discussion started by: kamil
3 Replies
Login or Register to Ask a Question