[NTLUG:Discuss] Is there an easy way?

Carl Haddick sysmail at glade.net
Mon Jul 27 11:07:03 CDT 2009


On Sun, Jul 26, 2009 at 12:06:14AM -0500, Leroy Tennison wrote:
> I'm not even sure how to Google for this one without having to wade 
> through too many extraneous hits so I'm posting here.  I have three 
> files and need to merge fields from each of them into a single file.  A 
> brief description of each is:
> 
> File 1 has a phone number and an associated IP address (VOIP, Avaya PBX)
> File 2 has an IP address and an associated MAC address (Cisco router).
> File 3 has a MAC address and associated Cisco switch port assignment.
> 
> I need a file containing phone number and associated switch port.
> 
> This may be somewhat OT except I'm hoping there's a Linux utility which 
> will meet the need.  I know that I can turn each file into a database 
> table and do some operation on two tables to "merge" their fields and 
> then repeat again to get what I need but that's the extent of my 
> understanding of that option.  Wondering if there's a utility to take 
> the files directly and do the "merge".  This is a situation where 
> scripting seems to be the wrong solution, I've written something similar 
> in awk and don't want to do that again.  I'm also not looking forward to 
> writing a program in a "real programming language" to accomplish this 
> either.  Thanks for any input.
> 
> _______________________________________________
> http://www.ntlug.org/mailman/listinfo/discuss

Ok, I'll admit, I keep hoping someday somebody will need a Python
hacker.  I guess I really know how to pick languages, I've also got
extensive Forth experience.  But I gotta say for some things Forth can
really get the job done.  If I was ever stranded on a desert island with
nothing but a PDP11 running nothing but a front panel I'd have Forth
running in a week, which would let me write a simple word processor in
another week, and then I could print out my message to tuck in a handy
bottle...

Anyway, two 'for' loops in Python came to mind:

#!/usr/local/bin/python

phoneip={}
macswitch={}
ipmac={}

for d in zip(
	(file('phoneip').readlines(),
	    file('ipmac').readlines(),
	    file('macswitch').readlines()),
	(phoneip,
	    ipmac,
	    macswitch)
	):
    for l in d[0]:
	key,val=l.strip().rsplit(' ',1)
	d[1][key]=val

for p in phoneip:
    ip=phoneip[p]
    mac=ipmac[ip]
    port=macswitch[mac]
    print 'Phone:%s has ip: %s, mac: %s, and is on port: %s'%(p,ip,mac,port)

The output from that is like:

Phone:(666) 234-5678 has ip: 4.5.6.7, mac: 22:33:44:55:66:77:88:99, and
is on port: p2
Phone:(777) 345-6789 has ip: 7.8.9.10, mac: 33:44:55:66:77:88:aa, and is
on port: p3
Phone:(555) 123-4567 has ip: 1.2.3.4, mac: 11:22:33:44:55:66:77:88, and
is on port: p1

But don't let me argue against the simple approach.  Cut, join, uniq,
sort, and most certainly awk are all supremely useful.  However, if you
need to pick through the files, regex out what you need, maybe do some
other housekeeping, a script approach might be the easy way out.

Three for loops.  That was three for loops in my Python blatherings, not
two.

Carl



More information about the Discuss mailing list