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

时间:2014-02-19 16:07:55

标签: 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=($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

2 个答案:

答案 0 :(得分:1)

您可以使用-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}

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

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

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

答案 1 :(得分:0)

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

#!/usr/bin/awk -f
script

别。它使你的shell脚本无限制地简化,而牺牲了调用awk的灵活性。将其更改为:

/usr/bin/awk '
script
' "$@"

然后你可以通过使用awks -v选项设置awk变量来解决你的问题,例如:

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

顺便说一下 - 如果你在Solaris上,请不要使用/ usr / bin / awk,因为它已经老了,破坏了awk。使用/ usr / xpg4 / bin / awk或nawk(甚至更好地安装和使用gawk)。