pythonRcpp
pythonRcpp

Reputation: 2146

Run command inside awk and store result inplace

I have a script that I need to run on every value. It basically return a number by taking an argument, like below

>>./myscript 4832
>>1100

my.csv contains the following:

123,4832
456,4833
789,4834

My command

cat my.csv | awk -F',' '{$3=system("../myscript $2");print $1,$2,$3'}

myscript is unable to understand that I'm passing the second input field $2 as argument. I need the output from the script to be added to the output as my 3rd column.

The expected output is

123,4832,1100
456,4833,17
789,4834,42

where the third field is the output from myscript with the second field as the argument.

Upvotes: 1

Views: 6175

Answers (5)

Frank-Rene Schäfer
Frank-Rene Schäfer

Reputation: 3352

You need to specify the $2 separately in the string concatenation, that is

awk -F',' '{ system("echo \"echo " $1 "$(../myexecutable " $2 ") " $3 "\" | bash"); }' my.csv

Upvotes: 0

Jose Ricardo Bustos M.
Jose Ricardo Bustos M.

Reputation: 8174

We can use in gnu-awk Two-Way Communications with Another Process

awk -F',' '{"../myscript "$2 |& getline v; print $1,$2,v}' my.csv

you get,

123 4832 1100
456 4833 17
789 4834 42
awk -F',' 'BEGIN { OFS=FS }{"../myscript "$2 |& getline v; print $1,$2,v}' my.csv

you get,

123,4832,1100
456,4833,17
789,4834,42

Upvotes: 1

Ed Morton
Ed Morton

Reputation: 204259

The syntax you want is:

awk 'BEGIN{FS=OFS=","}
{
    cmd = "./myscript \047" $2 "\047"
    val = ( (cmd | getline line) > 0 ? line : "NaN" )
    close(cmd)
    print $0, val
}
' file

Tweak the getline part to do different error handling if you like and make sure you read and fully understand http://awk.freeshell.org/AllAboutGetline before using getline.

Upvotes: 1

tripleee
tripleee

Reputation: 189749

If you are attempting to add a third field with the output from myscript $2 where $2 is the value of the second field, try

awk -F , '{ printf ("%s,%s,", $1, $2); system("../myscript " $2) }' my.csv

where we exploit the convenient fact that the output from myscript will complete the output without a newline with the calculated value and a newline.

This isn't really a good use of Awk; you might as well do

while IFS=, read -r first second; do
    printf "%s,%s," "$first" "$second"
    ../mycript "$second"
done <my.csv

I'm assuming you require comma-separated output; changing this to space-separated is obviously a trivial modification.

Upvotes: 4

NeronLeVelu
NeronLeVelu

Reputation: 10039

from GNU awk online documentation:

system: Execute the operating system command command and then return to the awk program. Return command’s exit status (see further on).

you need to use getline getline piped documentation

Upvotes: 0

Related Questions