将位置参数(指定列)传递给awk解释器

将位置参数(指定列)传递给awk解释器,awk,Awk,使用以下awk脚本,我正在计算数值数据的数值导数: #!/usr/bin/awk -f NR==1{x=$2;y=$3} # forward derivative for the first record and store values: NR==2{yprime=($3-y)/($2-x);xs=x;xi=$2;ys=y;yi=$3;print x, yprime} # central derivative (for the previous record) NR>2{yprime=(

使用以下awk脚本,我正在计算数值数据的数值导数:

#!/usr/bin/awk -f
NR==1{x=$2;y=$3}
# forward derivative for the first record and store values:
NR==2{yprime=($3-y)/($2-x);xs=x;xi=$2;ys=y;yi=$3;print x, yprime}
# central derivative (for the previous record)
NR>2{yprime=($3-ys)/($2-xs);print xi, yprime; xs=xi;xi=$2;ys=yi;yi=$3;}
# backward derivative for the last record:
END{yprime=($3-ys)/($2-xs); print $2, yprime;} 
示例数据如下所示:

050 -0.482 2.7005 2.7214 0.33 0.33256 1.0254 0.0095323
049 -0.48 2.6891 2.9106 0.33403 0.36155 1.114 0.01061
048 -0.47 0.72628 2.4895 -0.11639 -0.39894 0.89014 0.007514
047 -0.46 0.014188 0.12513 -0.32694 -2.8834 0.71609 0.0011619
046 -0.45 0.0069401 0.06229 -0.3289 -2.952 0.70036 0.00050154
045 -0.44 0.0051829 0.046877 -0.32881 -2.974 0.6922 0.00052942
044 -0.43 0.0044612 0.04055 -0.32848 -2.9857 0.6872 0.00025896
043 -0.42 0.0040918 0.037534 -0.32721 -3.0014 0.68384 0.00037138
042 -0.41 0.0039 0.036017 -0.32622 -3.0126 0.68058 0.0005044
041 -0.4 0.0037711 0.035516 -0.32308 -3.0428 0.67944 0.00061384
040 -0.39 0.0037183 0.035386 -0.32141 -3.0588 0.6771 0.00065571
039 -0.38 0.0037 0.035641 -0.31945 -3.0772 0.67461 0.0007741
运行

./numdiv.awk file.dat

我想更改我的脚本,以便可以将列编号指定为位置参数(这里是$2和$3)。Awk似乎有一个特殊的变量
ARGV
,可以用于它。

您可以使用
-v
选项将参数传递给Awk

请参见一个示例:

$ cat a
hello
i am here
but you are there

$ awk -v row=2 '{print $row}' a

am
you
例如,在您的情况下,您可以替换

NR==2{yprime=($3-y)/($2-x);xs=x;xi=$2;ys=y;yi=$3;print x, yprime}

并使用以下命令调用脚本:

awk -f your_script.awk -v first_col=2 -v second_col=4 file

您正在使用此shell shebang构造从shell脚本调用awk:

#!/usr/bin/awk -f
script
不要。它使您的shell脚本变得非常简洁,但牺牲了调用awk的灵活性。将其更改为:

/usr/bin/awk '
script
' "$@"
然后,您只需使用awk
-v
选项设置awk变量即可解决问题,例如:

/usr/bin/awk -v col=3 '
{ print $col }
' "$@"

顺便说一句,如果您使用的是Solaris,请不要使用/usr/bin/awk,因为这是旧的、损坏的awk。使用/usr/xpg4/bin/awk或nawk代替(或者更好地安装并使用gawk)。

因此您希望能够使用
NR==2{yprime=($other_ROW-y)
而不是
NR==2{yprime=($3-y)
并设置另一行值?是的。很抱歉,我的问题不清楚。ARGV[]是参数数组,它几乎总是简单的文件名。要从命令行设置awk变量,您可以使用
awk-v awkvar=value'…script…'文件
,除非在极少数情况下您会使用其他方法。如果没有帮助,请更新您的问题,以澄清您试图对预期输出执行的操作以及您的示例输入。是否可以在awk脚本中使用shebang行并使其可执行?您不需要使用shebang行来拥有调用awk的可执行shell脚本。这是一个坏习惯。我理解。这是一个是否存在这种可能性的问题。这将是一个shell问题,而不是awk问题,并且您只标记了this使用awk,所以shell专家不会看它。好吧,我不知道我使用#!/usr/bin/awk-f会失去灵活性。我将遵循fedorqui的答案,并将脚本作为选项传递给awk(使用shell作为包装器也是可能的,但不是必需的)。谢谢。好的。我不知道你为什么不直接将
#!/usr/bin/awk-f script
更改为
/usr/bin/awk'script'$@“
,并继续按原样使用它,但任何适合你的都可以。。。。
/usr/bin/awk -v col=3 '
{ print $col }
' "$@"