in reply to get value from a awk system command

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.

Replies are listed 'Best First'.
Re^2: get value from a awk system command
by filipebean (Novice) on Apr 10, 2013 at 16:24 UTC

    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.