in reply to Re: Better method to cut columns from delimited file
in thread Better method to cut columns from delimited file

Thank you BrowserUK :)

To be honest, I haven't often used slices... if I wanted to change the column name(s) I want selected on the fly, could that be fit into this one-liner equation relatively easily? (I'm well past the OP's problem, I'm curious for myself now)

  • Comment on Re^2: Better method to cut columns from delimited file

Replies are listed 'Best First'.
Re^3: Better method to cut columns from delimited file
by NetWallah (Canon) on May 10, 2012 at 05:21 UTC
    Still room for optimization, but here it is (Linux style quotes used):
    perl -F"\|" -anlE'%x= %x?%x:(map{$_=>$i++}@F);print "$F[ $x{NAME}]|$F +[$x{ZIP} ]"' junk2.txt
    (Unwound the slice, and used Names as indexes)

                 I hope life isn't a big joke, because I don't get it.
                       -SNL

Re^3: Better method to cut columns from delimited file
by BrowserUk (Patriarch) on May 10, 2012 at 05:33 UTC
    if I wanted to change the column name(s) I want selected on the fly, could that be fit into this one-liner equation relatively easily?

    If you mean "change which columns are selected", or their ordering, that's trivial:

    C:\test>perl -F"\|" -anle"print join'|', @F[ 1,3, 0,2 ]" junk.csv AGE|ZIP|NAME|CITY 23|60001|AAA|STAT 34|12345|BBB|PPOR 11|2345|CCC|TRET

    If you want to select by column name, that's a bit harder to do as a one-liner:

    C:\test>perl -F"\|" -anle"$n=0;if($.==1){ %names=map{$_,$n++}@F;next}; + print join'|', @F[@names{'AGE','NAME'}]" junk.csv 23|AAA 34|BBB 11|CCC

    But why would you want to do that as a one liner? (Ie. Why would you use the names rather than the column numbers directly in a one-liner?)

    If you want to write a script that gets names from the command line and uses that to select columns from a file:

    #! perl -slw use strict; my @selection = delete @ARGV[ 1 .. $#ARGV ]; my $n = 0; my @colnames = split /\|/, scalar <>; my %colnames = map{ $_ => $n++ } @colnames; print join '|',@colnames[ @colnames{ @selection } ]; while( <> ) { print join '|', ( split '\|' )[ @colnames{ @selection } ]; } __END__ C:\test>junk.pl junk.csv AGE NAME AGE|NAME 23|AAA 34|BBB 11|CCC

    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.

    The start of some sanity?