使用以下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
。
答案 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)。