Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

get value from a awk system command

by filipebean (Novice)
on Apr 10, 2013 at 13:53 UTC ( #1027971=perlquestion: print w/replies, xml ) Need Help??
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 (Monsignor) 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.

      Ive 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 (Chancellor) 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 (Prior) 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 (Prior) 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

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1027971]
Front-paged by Corion
help
Chatterbox?
Discipulus was a question
[GotToBTru]: current job found me
Discipulus is so lucky to have a decent job, with old, favorable contract, done before the ultralibersm arrived in Eataly
[Lady_Aleena]: Has anyone here ever use pcregrep? I can't seem to get the --include regex right. --include=*.p[lm] works in grep but not pcregrep.
[erix]: to lift your spirits, here is some more happy Randy news...
[Lady_Aleena]: The reason I would like to use pcregrep is because it can do multiline searches supposedly.
[perldigious]: What are your criteria for looking Tanktalus? What things must a job have for you to consider it? And where are you in your career? Start, middle, or end?
[erix]: are there any regex-engines that do not do multiline?
[Lady_Aleena]: erix, grep doesn't.
[Lady_Aleena]: Linux grep that is...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (9)
As of 2017-05-23 19:17 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?