On Fri, 2004-10-01 at 05:12, John W. Krahn wrote: > Jose Alves de Castro wrote: > > To make it short: I have a small filter that I'd like to keep as compact > > as possible, while not losing efficiency. > > > > How it works: > > > > 1) ignore the first line (it's a header line) > > 2) if a line ends in a tab, remove that character > > 3) replace all tabs with pipes > > 4) if the line now ends in a pipe, add a space at the end > > > > This all looks pretty easy, right? > > Change that to three steps: > > 1) ignore the first line (it's a header line) > 2) replace all tabs with pipes > 3) if a line ends in a pipe, change it to a space.
Well... all lines have fields separated with tabs and they all end in a tab, too... Here are some examples: a\tb\t a\t\t \tb\t \t\t\t The output for all these should be: a|b a|\s |b |\s (I know \s isn't a space, but that was for stating it visually) This means that I could start by replacing all tabs with pipes, but then I would always have to remove the last pipe... I could replace two ending pipes with "| " (second and fourth cases), but I would also have to remove a single ending pipe (first and third cases) Sorry if I wasn't clear in the beginning. > Even easier. > > > > So, here's an attempt: > > > > #!/usr/bin/perl -lwn > > use strict; > > > > $. - 1 || next; > > s/\t$//; > > y/\t/|/; > > s/\|$/ /; > > print; > > #!/usr/bin/perl -lwp > use strict; > > $. - 1 || next; > y/\t/|/; > s/\|$/ /; > > > > John -- José Alves de Castro <[EMAIL PROTECTED]> http://natura.di.uminho.pt/~jac