from collections import defaultdict
from itertools import groupby
import sys
file = sys .stdin
"""
I need to calculate timestamp difference of first line in group and the first line of the next, for all groups corresponding to same (column2, column3).
"""
rows = ( line.split ( ) for line in file if line.strip ( ) ) # columns are space-separated
# find timestamps
timestamps = defaultdict( list ) # (source ip, destination ip) -> timestamps of 1st lines
for ( ( source, dest) , _) , group in groupby( enumerate ( rows) ,
key= lambda ( i, row) : ( row[ 1 :3 ] , i - int ( row[ 3 ] ) ) ) :
ts = float ( next( group) [ 1 ] [ 0 ] ) # a timestamp from the 1st line in a group
timestamps[ source, dest] .append ( ts)
# find differences
for ( source_ip, dest_ip) , t in sorted ( timestamps.items ( ) , key= lambda ( x, y) : x) :
diffs = [ b - a for a, b in zip ( t, t[ 1 :] ) ] # pairwise differences
info = ", " .join ( map ( str , diffs) ) if diffs else t # support unique (source, dest)
print ( "{source_ip} {dest_ip}: {info}" .format ( **vars ( ) ) )
ZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKZnJvbSBpdGVydG9vbHMgaW1wb3J0IGdyb3VwYnkKCmltcG9ydCBzeXMKZmlsZSA9IHN5cy5zdGRpbgoKIiIiCkkgbmVlZCB0byBjYWxjdWxhdGUgdGltZXN0YW1wIGRpZmZlcmVuY2Ugb2YgZmlyc3QgbGluZSBpbiBncm91cCBhbmQgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIG5leHQsIGZvciBhbGwgZ3JvdXBzIGNvcnJlc3BvbmRpbmcgdG8gc2FtZSAoY29sdW1uMiwgY29sdW1uMykuCiIiIgpyb3dzID0gKGxpbmUuc3BsaXQoKSBmb3IgbGluZSBpbiBmaWxlIGlmIGxpbmUuc3RyaXAoKSkgIyBjb2x1bW5zIGFyZSBzcGFjZS1zZXBhcmF0ZWQKCiMgZmluZCB0aW1lc3RhbXBzCnRpbWVzdGFtcHMgPSBkZWZhdWx0ZGljdChsaXN0KSAjIChzb3VyY2UgaXAsIGRlc3RpbmF0aW9uIGlwKSAtPiB0aW1lc3RhbXBzIG9mIDFzdCBsaW5lcwpmb3IgKChzb3VyY2UsIGRlc3QpLCBfKSwgZ3JvdXAgaW4gZ3JvdXBieShlbnVtZXJhdGUocm93cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1sYW1iZGEgKGksIHJvdyk6IChyb3dbMTozXSwgaSAtIGludChyb3dbM10pKSk6CiAgICB0cyA9IGZsb2F0KG5leHQoZ3JvdXApWzFdWzBdKSAjIGEgdGltZXN0YW1wIGZyb20gdGhlIDFzdCBsaW5lIGluIGEgZ3JvdXAKICAgIHRpbWVzdGFtcHNbc291cmNlLCBkZXN0XS5hcHBlbmQodHMpCgojIGZpbmQgZGlmZmVyZW5jZXMKZm9yIChzb3VyY2VfaXAsIGRlc3RfaXApLCB0IGluIHNvcnRlZCh0aW1lc3RhbXBzLml0ZW1zKCksIGtleT1sYW1iZGEgKHgseSk6IHgpOgogICAgZGlmZnMgPSBbYiAtIGEgZm9yIGEsIGIgaW4gemlwKHQsIHRbMTpdKV0gIyBwYWlyd2lzZSBkaWZmZXJlbmNlcyAgIAogICAgaW5mbyA9ICIsICIuam9pbihtYXAoc3RyLCBkaWZmcykpIGlmIGRpZmZzIGVsc2UgdCAjIHN1cHBvcnQgdW5pcXVlIChzb3VyY2UsIGRlc3QpCiAgICBwcmludCgie3NvdXJjZV9pcH0ge2Rlc3RfaXB9OiB7aW5mb30iLmZvcm1hdCgqKnZhcnMoKSkpCiAgIA==
stdin
MC4wIGFhOmJiOmNjIGRkOmVlOmZmIDEwMCAgMDAwIC0tLS0tLS0tLS0mZ3Q7bGluZTEKMC4yIGFhOmJiOmNjIGRkOmVlOmZmIDEwMSAgMDExIC0tLS0tLS0tLS0mZ3Q7bGluZTIKMC41IGRkOmVlOmZmIGFhOmJiOmNjIDIzMCAgMDAxIC0tLS0tLS0tLS0mZ3Q7bGluZTMKMC45IGRkOmVlOmZmIGFhOmJiOmNjIDIzMSAgMTEwIC0tLS0tLS0tLS0mZ3Q7bGluZTQKMS4yIGRkOmVlOmZmIGFhOmJiOmNjIDIzMiAgMTAxIC0tLS0tLS0tLS0mZ3Q7bGluZTUKMS40IGFhOmJiOmNjIGRkOmVlOmZmIDEwMiAgMTExMSAtLS0tLS0tLS0tJmd0O2xpbmU2CjEuNiBhYTpiYjpjYyBkZDplZTpmZiAxMDMgIDExMDEgLS0tLS0tLS0tLSZndDtsaW5lNwoxLjcgYWE6YmI6Y2MgZGQ6ZWU6ZmYgMTA4ICAxMDAxIC0tLS0tLS0tLS0mZ3Q7bGluZTgKMi40IGRkOmVlOmZmIGFhOmJiOmNjIDIzMyAgMTAwMCAtLS0tLS0tLS0tJmd0O2xpbmU5ICAKMi44IGdnOmhoOmlpIGpqOmtrOmxsIDQ1MCAgMTExMCAtLS0tLS0tLS0tJmd0O2xpbmUxMAozLjIgamo6a2s6bGwgZ2c6aGg6aWkgNjAwICAwMTAgLS0tLS0tLS0tLSZndDtsaW5lMTEgIA==
0.0 aa:bb:cc dd:ee:ff 100 000 ---------->line1
0.2 aa:bb:cc dd:ee:ff 101 011 ---------->line2
0.5 dd:ee:ff aa:bb:cc 230 001 ---------->line3
0.9 dd:ee:ff aa:bb:cc 231 110 ---------->line4
1.2 dd:ee:ff aa:bb:cc 232 101 ---------->line5
1.4 aa:bb:cc dd:ee:ff 102 1111 ---------->line6
1.6 aa:bb:cc dd:ee:ff 103 1101 ---------->line7
1.7 aa:bb:cc dd:ee:ff 108 1001 ---------->line8
2.4 dd:ee:ff aa:bb:cc 233 1000 ---------->line9
2.8 gg:hh:ii jj:kk:ll 450 1110 ---------->line10
3.2 jj:kk:ll gg:hh:ii 600 010 ---------->line11