Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!usc!zaphod.mps.ohio-state.edu!van-bc!ubc-cs!phillips From: phillips@cs.ubc.ca (George Phillips) Newsgroups: comp.lang.perl Subject: Re: Simple perl question Message-ID: <9212@ubc-cs.UUCP> Date: 20 Aug 90 22:20:13 GMT References: <24941@boulder.Colorado.EDU> Sender: news@cs.ubc.ca Organization: University of British Columbia, Vancouver, B.C., Canada Lines: 45 In article <24941@boulder.Colorado.EDU> jorgy@refuge.colorado.edu (Eric R. Jorgensen) writes: >I have input that looks like: > >x 1 >x 5 >x 6 >x 7 >y 25 >y 26 > >And I would like output like: > >x 1,5-7 >y 25-26 Here's a script which should do it. I'd bet Randal can manage this in 3 greps and 5 regexps or less. #!/usr/bin/perl while (<>) { ($left, $num) = split; $nums{$left} .= $num . " "; } while (($left, $num) = each %nums) { print "$left\t"; @snum = sort(bynum split(' ', $num)); $#srange = -1; for ($i = 0; $i <= $#snum; $i = $j) { for ($j = $i; $j <= $#snum && $snum[$i] == $snum[$j] + $i - $j; $j++) {} if ($j == $i + 1) { push (@srange, $snum[$i]); } else { push (@srange, "$snum[$i]-$snum[$j-1]"); } } print join(',', @srange) . "\n"; } sub bynum { $a - $b; } -- George Phillips phillips@cs.ubc.ca {alberta,uw-beaver,uunet}!ubc-cs!phillips