在awk中运行命令并将结果存储在适当的位置

在awk中运行命令并将结果存储在适当的位置,awk,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列添加到输出

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

>>./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
的输出,第二个字段作为参数。

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

awk -F',' '{ system("echo \"echo " $1 "$(../myexecutable " $2 ") " $3 "\" | bash"); }' my.csv
我们可以在gnu awk中使用

你得到

123 4832 1100 456 4833 17 789 4834 42 123,4832,1100 456,4833,17 789,4834,42 你得到

123 4832 1100 456 4833 17 789 4834 42 123,4832,1100 456,4833,17 789,4834,42 123,4832,1100 456,4833,17 789,4834,42
来自GNU awk在线文档:

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


您需要使用getline

如果您试图添加第三个字段,其中
myscript$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
当IFS=,第一秒读取-r;做
printf“%s,%s”,“$first”“$second”
../mycript“$second”

完成您想要的语法是:

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


如果您愿意,可以调整getline部分以执行不同的错误处理,并确保在使用getline之前阅读并完全理解。

它给了我
127100 4832155200921276976:没有这样的文件或目录4832155200921276984
Myscript在newline中返回答案(这是否有问题?)。127100和4…6是my.csv中我的两列值。基本原因是您的问题未能指定您实际需要的内容。但是
system(“echo”)
可能不是任何问题的好答案。将
$2
放在双引号之外的基本建议是,@pythonRcpp您介意运行编辑过的脚本并查看它的功能吗。现在它给了我firstcolumnvaluefromscript(看起来非常接近预期的解决方案这只提供脚本的结果。按脚本的值(我的脚本输出以换行符形式给出,我想知道这是否有问题)它不打印$1、$2,而是打印v(前缀为空格)@pythonRcpp我修复了我的帖子仍然是相同的结果你应该提到这是一个特定于gawk的扩展,它在其他Awk中不起作用。我不清楚你所说的
$2
是什么意思。第一个命令行参数是
$1
,但是Awk变量
$1
不同于shell变量
$1
,它的意思是:这是不同的。你能澄清一下你到底希望在这里发生什么吗?还要注意,我希望我的.csv文件中的第二个字段值作为我脚本的参数,并将脚本的结果保存为我的.csv更新问题中的第三个字段,并进行澄清;请查看。它返回我,outputbyscript,我尝试运行
,而IFS=,读取-r first second;do printf“%s,%s,“$first”“$second”;完成是的,您忽略了对
myscript
的调用,它提供了第三个字段和换行符,正如我试图解释的那样。如果您想要
printf
中的换行符,那就是
printf“%s,%s,\n”“$first”“$second”
但是…我真的猜不出你想用它去哪里。不,我只是想检查命令,根本不调用脚本,它应该打印前2列,就是这样。没有换行符。它只打印我脚本的输出。要模拟而不是myscript,请运行任何可以占用脚本1个参数的bash命令,我posted会将
myscript
中的stdout保存到名为
val
的变量中。如果没有发生这种情况,则可能是复制/粘贴错误,或者
myscript
的输出不会进入stdout。请尝试将调用更改为“”/myscript\047“$2”\047 2>&1”,以查看其输出是否改为进入stderr。