在awk中运行命令并将结果存储到位

时间:2017-03-09 12:14:35

标签: awk

我有一个脚本需要在每个值上运行。它基本上通过参数返回一个数字,如下面的

>>./myscript 4832
>>1100

my.csv包含以下内容:

123,4832
456,4833
789,4834

我的命令

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

myscript无法理解我将第二个输入字段$2作为参数传递。我需要将脚本的输出作为我的第3列添加到输出中。

预期输出

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

其中第三个字段是myscript的输出,第二个字段作为参数。

5 个答案:

答案 0 :(得分:1)

如果您尝试使用myscript $2的输出添加第三个字段,其中$2是第二个字段的值,请尝试

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

我们利用这样一个方便的事实:myscript的输出将完成输出而没有带有计算值和换行符的换行符。

这对Awk来说并不是很好用;你不妨做什么

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

我假设你需要以逗号分隔的输出;把它改成空格分离显然是一个微不足道的修改。

答案 1 :(得分:0)

您需要在字符串连接中单独指定$2,即

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

答案 2 :(得分:0)

我们可以在gnu-awk Two-Way Communications with Another Process

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

你明白了,

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

你明白了,

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

答案 3 :(得分:0)

来自GNU awk在线文档:

system:执行操作系统命令命令,然后返回awk程序。返回命令的退出状态(参见下文)。

您需要使用getline getline piped documentation

答案 4 :(得分:0)

您想要的语法是:

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

如果您愿意,请调整getline部分以执行不同的错误处理,并确保在使用getline之前阅读并完全理解http://awk.freeshell.org/AllAboutGetline