[aklug] Re: perl lists question, sorting, sort of.

From: Michael Fowler <michael@shoebox.net>
Date: Tue Aug 17 2010 - 21:38:34 AKDT

On Tue, Aug 17, 2010 at 04:50:56PM -0800, Tim Gibney wrote:
> That is alot of strange idiosyncratic babble I have ever seen to print a
> simple hosts file I.P addresses with a sort. Wouldn't python ... or even
> bash be easier? Perl scares me

Neither would be much easier. Below is my Python version. I don't like
you (or, probably, anyone) enough to write a bash version.

This even sorts IPv6 properly.

    #!/usr/bin/python

    import socket

    def extract_ipaddr(row):
        ipaddr = row[0]
        try:
            packed = socket.inet_pton(socket.AF_INET6, ipaddr)
            addrtype = 6
        except:
            packed = socket.inet_pton(socket.AF_INET, ipaddr)
            addrtype = 4

        print ipaddr, addrtype
        return (addrtype, packed)

    def compare_ipaddr(left, right):
        return cmp(left[0], right[0]) or cmp(left[1], right[1])

    hosts = open('/etc/hosts', 'r');
    ipaddrs = {}
    maxcol = 0
    for line in hosts:
        line = line.strip()

        if line.startswith('#'): continue
        if line == '': continue

        row = line.split()
        ipaddr = row[0]

        if ipaddr not in ipaddrs:
            ipaddrs[ipaddr] = []

        ipaddrs[ipaddr].extend(row[1:])

        if len(row) > maxcol:
            maxcol = len(row)

    maxlen = [0 for x in range(0, maxcol)]
    table = [[k] + v[:] for k, v in ipaddrs.iteritems()]
    table.sort(key = extract_ipaddr)
    print table

    for row in table:
        for i in range(0, maxcol - len(row)):
            row.append('')

        for i in range(0, len(row)):
            if len(row[i]) > maxlen[i]:
                maxlen[i] = len(row[i])

    format = ' '.join('%%-%ds' % x for x in maxlen[:-1]) + ' %s'
    for row in table:
        print format % tuple(row)

--
Michael Fowler
www.shoebox.net
---------
To unsubscribe, send email to <aklug-request@aklug.org>
with 'unsubscribe' in the message body.
Received on Wed Aug 18 00:13:52 2010

This archive was generated by hypermail 2.1.8 : Wed Aug 18 2010 - 00:13:52 AKDT