http://www.perlmonks.org?node_id=1027971

filipebean has asked for the wisdom of the Perl Monks concerning the following question:

Hi all,

I'm a bit lost in this topic, can someone advice please.

I want to read some lines from a file that have a specific value in field number 3:

my @rows = `cat file.csv | awk -F';' '{if ($3==1) print $0}'`; my $lines= join("\n",@rows ); printlog("string: $lines");

instead of having the lines filtered, $lines is empty. when I execute the command on solaris it work...

any idea??

thank you in advance.

Replies are listed 'Best First'.
Re: get value from a awk system command
by hippo (Bishop) on Apr 10, 2013 at 15:23 UTC
    when I execute the command on solaris it work...

    You have not said under what conditions it fails - all we can assume is "not Solaris" which doesn't narrow it down much. However, here are a few observations.

    Your file is called file.csv but you are using a semicolon as the delimiter and not a comma as the filename suggests, so perhaps that is your error?

    The awk command includes some dollar symbols which are not escaped, so that will almost certainly give you grief. One of them (in $0) is unnecessary, so can be omitted. If we do that, remove the UUoC and perform the necessary escaping we arrive at

    my @rows = `awk -F';' '\$3==1' file.csv`;

    which seems to work fine assuming the semi-colon really is the delimiter.

    Notwithstanding all this, there's no benefit of shelling out to awk unless it's demonstrably faster than using perl which is doubtful for all but very large datasets.

      Hi,

      thank you for your help, I tried your sugestion but @rows still empty... :(

      the delimiter is ; and I've check that.

      I´ve also tried the command perl:

      perl -a -F/;/ -ne  "print if $F[2]==1" file.csv

      and it also dont work.

      :(

        When you post a message like this, do NOT say "it doesn't work". Instead, show what you tried, what you got, and what you wanted. Use copy/paste rather than typing from memory.

        eg:

        I tried the code

        use warnings; use strict; print "$0";
        the results I got were just
        test.pl
        But I was hoping to get something more like "perl test.pl" printed out.

        Actually, it does work. Here's the source data in file.csv:

        a;b;1;foo j;k;2;dog m;n;3;cat y;z;1;bar

        And here's the script, which I have called at.pl:

        #!/usr/bin/perl -w use strict; use warnings; my @rows = `awk -F';' '\$3==1' file.csv`; my $lines= join('', @rows ); print "string: $lines"; exit;

        and here's the output from running ./at.pl:

        $ ./at.pl string: a;b;1;foo y;z;1;bar $

        awk is gawk 4.0.0, perl is 5.14.2. I still don't recommend doing it this way for reasons of efficiency and external dependency but it does give the right output.

Re: get value from a awk system command
by LanX (Saint) on Apr 10, 2013 at 13:57 UTC
    > any idea??

    Yes, use Perl! =)

    This language was primarily invented to get rid of sed and awk!

    have a look at a2p (Awk to Perl translator) to have a start.

    Cheers Rolf

    ( addicted to the Perl Programming Language)

Re: get value from a awk system command
by hdb (Monsignor) on Apr 10, 2013 at 14:34 UTC

    Here is the Perl code:

    open $fh, "<", "file.csv"; my $lines; while(<$fh>) { my @record = split /;/; # split on semicolon $lines .= $_ if $record[2] == 1; } close $fh; print("string: $lines");
Re: get value from a awk system command
by hdb (Monsignor) on Apr 10, 2013 at 14:45 UTC

    The Perl equivalent of the awk command itself is

    perl -a -F/;/ -ne "print if $F[2]==1" file.csv