Array & text file

Hi all,
i have a text file such as:

10 17:54:47,213
10 17:54:47,214
10 17:54:49,338
10 17:54:49,399
10 17:54:50,402
10 17:54:50,403
11 17:54:47,213
11 17:54:47,213
11 17:54:49,362
11 17:54:49,422
11 17:54:50,429
11 17:54:50,429
11 17:54:50,429
11 17:54:50,429
11 17:54:51,510
12 17:54:47,213
12 17:54:47,214
12 17:54:49,311
12 17:54:49,383
12 17:54:50,379
12 17:54:50,380
12 17:54:50,380
12 17:54:50,380
12 17:54:51,460
24 18:30:01,405
24 18:30:01,406
24 18:30:03,122
24 18:30:03,122
24 18:30:03,122

My objective is to make the difference of time between first value of first digit column and last value of the same occurrency.
In fact:
First occurrency of 10: 10 17:54:47,213
Last occurrency of 10: 10 17:54:50,403

I make 17:54:50,403 - 17:54:47,213 = result (in a new text file)

This is for every valure of first column.

Regards

Could this help you ?

awk 'BEGIN{lastH=0}
{ if(!a[$1]) {
if ( lastH != 0 ) {
print prev,lastH - fstH":"lastM - fstM":"lastS - fstS":"lastMS - fstMS }
fstH=substr($2,1,2);fstM=substr($2,4,2);fstS=substr($2,7,2);fstMS=substr($2,10);
a[$1]++
} else {
prev=$1
lastH=substr($2,1,2);lastM=substr($2,4,2);lastS=substr($2,7,2);lastMS=substr($2,10);
} } END { print prev,lastH - fstH":"lastM - fstM":"lastS - fstS":"lastMS - fstMS}' filename

for given input this will work

awk '
        BEGIN {
                    m1 = "First occurrency of"
                    m2 = "Last occurrency of"
              }
NR==1 || p!=$1{
                   print s ? m2 FS x FS ":" FS s RS m1 FS $1 ":" $0 : m1 FS $1 FS ":" FS $0
              }
              {
                p=$1;s=$0; x=$1
              }
           END{
                     print m2 FS $1 ":" $0
              }
   ' file

Resulting

First occurrency of 10 : 10 17:54:47,213
Last occurrency of 10 : 10 17:54:50,403
First occurrency of 11:11 17:54:47,213
Last occurrency of 11 : 11 17:54:51,510
First occurrency of 12:12 17:54:47,213
Last occurrency of 12 : 12 17:54:51,460
First occurrency of 24:24 18:30:01,405
Last occurrency of 24:24 18:30:03,122

It's good....
but difference is not correct...the result is wrong:(

this is complete list of item:

10 17:54:47,213
10 17:54:47,214
10 17:54:49,338
10 17:54:49,399
10 17:54:50,402
10 17:54:50,403
11 17:54:47,213
11 17:54:47,213
11 17:54:49,362
11 17:54:49,422
11 17:54:50,429
11 17:54:50,429
11 17:54:50,429
11 17:54:50,429
11 17:54:51,510
12 17:54:47,213
12 17:54:47,214
12 17:54:49,311
12 17:54:49,383
12 17:54:50,379
12 17:54:50,380
12 17:54:50,380
12 17:54:50,380
12 17:54:51,460
24 18:30:01,405
24 18:30:01,406
24 18:30:03,122
24 18:30:03,122
24 18:30:03,122
24 18:30:03,122
24 18:30:04,213
25 18:30:01,406
25 18:30:01,406
25 18:30:03,124
25 18:30:03,124
25 18:30:03,124
25 18:30:03,124
25 18:30:04,214
26 18:30:01,406
26 18:30:01,406
26 18:30:03,122
26 18:30:03,122
26 18:30:03,122
26 18:30:03,122
26 18:30:04,202
29 18:30:01,407
29 18:30:01,407
29 18:30:03,142
29 18:30:03,142
29 18:30:03,142
29 18:30:03,142
29 18:30:04,223
31 18:30:01,407
31 18:30:01,407
31 18:30:03,072
31 18:30:03,072
31 18:30:03,072
31 18:30:03,072
31 18:30:04,153
40 21:19:31,946
40 21:19:31,946
40 21:19:33,297
40 21:19:33,297
40 21:19:33,297
40 21:19:33,297
40 21:19:34,388
41 21:19:31,946
41 21:19:31,946
41 21:19:33,297
41 21:19:33,297
41 21:19:33,297
41 21:19:33,297
41 21:19:34,388
42 21:19:31,947
42 21:19:31,947
42 21:19:33,296
42 21:19:33,296
42 21:19:33,296
42 21:19:33,296
42 21:19:34,376
45 21:19:31,947
45 21:19:31,947
45 21:19:33,315
45 21:19:33,315
45 21:19:33,315
45 21:19:33,315
45 21:19:34,395
46 21:19:31,947
46 21:19:31,947
46 21:19:34,108
46 21:19:34,108
46 21:19:34,108
46 21:19:34,108
46 21:19:35,188
56 21:49:32,076
56 21:49:32,076
56 21:49:33,868
56 21:49:33,868
56 21:49:33,868
56 21:49:33,868
56 21:49:34,958
57 21:49:32,076
57 21:49:32,076
57 21:49:33,869
57 21:49:33,869
57 21:49:33,869
57 21:49:33,869
57 21:49:34,959
58 21:49:32,076
58 21:49:32,076
58 21:49:33,865
58 21:49:33,865
58 21:49:33,865
58 21:49:33,865
58 21:49:34,946
59 21:49:32,077
59 21:49:32,077
59 21:49:33,886
59 21:49:33,886
59 21:49:33,886
59 21:49:33,886
59 21:49:35,476
61 21:49:32,077
61 21:49:32,077
61 21:49:33,820
61 21:49:33,820
61 21:49:33,820
61 21:49:33,820
61 21:49:34,900
8 17:54:47,213
8 17:54:47,213
8 17:54:49,340
8 17:54:49,410
8 17:54:55,803
8 17:54:55,803
9 17:54:47,213
9 17:54:47,213
9 17:54:49,341
9 17:54:49,430
9 17:54:55,869
9 17:54:55,869

---------- Post updated at 06:00 AM ---------- Previous update was at 05:43 AM ----------

With this code i receive this error:

awk: syntax error near line 1
awk: illegal statement near line 1
awk: syntax error near line 1
awk: illegal statement near line 1

Try : for difference

awk '
NR==1 || p!=$1{
                  Arr[++j] = s ? s RS $0 : $0
              }
              {
                p=$1;s=$0
              }
           END{
                   Arr[j+1]=$0
                   for(i=1;i<=j;i++){
                                         split(Arr,S1,RS);split(Arr[i+1],S2,RS)
                                         start = i == 1? S1[1] : S1[2]
                                         end   = i == 1? S2[1] : S2[1]
                                         split(start,St,"[:, ]");split(end,Se,"[:, ]")
                                         print start,end,((Se[2]*3600)+(Se[3]*60)+Se[4])-((St[2]*3600)+(St[3]*60)+St[4]),"Sec"
                                    }   
              }
   ' file

OR

awk  '

function sec(val){
                      gsub(/^.*[[:space:]]|,.*/,x,val)
                      split(val,Ar,":")
                      return ((Ar[1]*3600)+(Ar[2]*60)+Ar[3])
                 }
FNR==1 || p != $1{
                  if(s){
                         print t,s, sec(s)-sec(t),"sec"
                       }
                        t = $0 
                 }
                 {
                        p=$1;s=$0
                 }
             END{
                     print t,s,sec(s)-sec(t),"sec"
                }
           
   ' file

for input in post #1

10 17:54:47,213 10 17:54:50,403 3 Sec
11 17:54:47,213 11 17:54:51,510 4 Sec
12 17:54:47,213 12 17:54:51,460 4 Sec
24 18:30:01,405 24 18:30:03,122 2 Sec

for input in post #4

10 17:54:47,213 10 17:54:50,403 3 Sec
11 17:54:47,213 11 17:54:51,510 4 Sec
12 17:54:47,213 12 17:54:51,460 4 Sec
24 18:30:01,405 24 18:30:04,213 3 Sec
25 18:30:01,406 25 18:30:04,214 3 Sec
26 18:30:01,406 26 18:30:04,202 3 Sec
29 18:30:01,407 29 18:30:04,223 3 Sec
31 18:30:01,407 31 18:30:04,153 3 Sec
40 21:19:31,946 40 21:19:34,388 3 Sec
41 21:19:31,946 41 21:19:34,388 3 Sec
42 21:19:31,947 42 21:19:34,376 3 Sec
45 21:19:31,947 45 21:19:34,395 3 Sec
46 21:19:31,947 46 21:19:35,188 4 Sec
56 21:49:32,076 56 21:49:34,958 2 Sec
57 21:49:32,076 57 21:49:34,959 2 Sec
58 21:49:32,076 58 21:49:34,946 2 Sec
59 21:49:32,077 59 21:49:35,476 3 Sec
61 21:49:32,077 61 21:49:34,900 2 Sec
8 17:54:47,213 8 17:54:55,803 8 Sec
9 17:54:47,213 9 17:54:55,869 8 Sec

Another variation

awk '
		{split($2,a,":|,")
		t=a[1]*3600+a[2]*60+a[3]+a[4]/1000
		$0=$1 FS sprintf ("%.3f\n",t)}
	
	NR==1 {f=$1
		t1=$2} 
	f!=$1 {x=$2
		split(l,b," ")
		t=b[2]-t1
		print b[1],strftime("%T",int(t)-3600)"." (t-int(t))*1000
		f=$1}
	
		{l=$0}
	END	{t=$2-x
		print $1,strftime("%T",int(t)-3600)"." (t-int(t))*1000}
	' file

Gives for data in post #1:

10 00:00:03.190
11 00:00:04.297
12 00:00:04.247
24 00:00:01.717

Jotne,
i received this error with your version of script:
awk: syntax error near line 11
awk: illegal statement near line 11
awk: syntax error near line 16
awk: illegal statement near line 16

Can you help me?

I guess its the strftime command
It may be replaced by some like this:

h=int($0/3600);m=int(($0-h*3600)/60);s=($0-h*3600-m*60);printf "%02d:%02d:%02d\n",h,m,s

How did you try ? whoever posted answer upto current post in this thread all are working, which OS you are using ?

I make a script and inserted your code!
My OS is Solaris!!!

As always.... use nawk instead of awk on Solaris,