Command line 通过命令行参数计算任意字段平均值的通用awk脚本

Command line 通过命令行参数计算任意字段平均值的通用awk脚本,command-line,scripting,awk,average,Command Line,Scripting,Awk,Average,我想编写一个通用的awk脚本,它可以将一个文件和一个字段号(在该文件中)作为输入,并给出该文件中该字段的平均值。我会这样使用它: bash$ avg.awk 3 input.file 22 bash$ avg.awk 4 input.file 2001 //{tot+=$3; count++} END{ print tot/count; } 当然,如果我事先知道要平均哪个字段(例如$3),我可以编写脚本。可能是这样的: bash$ avg.awk 3 input.file 22 ba

我想编写一个通用的awk脚本,它可以将一个文件和一个字段号(在该文件中)作为输入,并给出该文件中该字段的平均值。我会这样使用它:

bash$ avg.awk 3 input.file
22
bash$ avg.awk 4 input.file
2001
//{tot+=$3; count++}
END{
    print tot/count;
}
当然,如果我事先知道要平均哪个字段(例如$3),我可以编写脚本。可能是这样的:

bash$ avg.awk 3 input.file
22
bash$ avg.awk 4 input.file
2001
//{tot+=$3; count++}
END{
    print tot/count;
}
但我希望能够通过命令行选项更改要平均的字段。可能吗?谢谢

{ tot += $field; count++ }
END { print tot/count }
打电话
awk-v field=3-f avg.awk input.file

此文件将执行您想要的操作:

$ cat avg.awk
#!/usr/bin/env awk -f
# Calculate average, syntax: avg.awk field-number file
BEGIN { field = ARGV[1]; ARGV[1] = "" }
{ sum += $field }
END { print sum / NR }

$ cat data
1 5 7
3 6 5
8 4 6

$ avg.awk 1 data
4

$ avg.awk 2 data
5

$ avg.awk 3 data
6

您可以使用NR来避免使用计数变量:{tot+=$f}END{print tot/NR}。。。假设OP实际上不想过滤标题或跳过记录。:)谢谢,它确实有效!另一个答案使命令行更易于使用:)我不能像您描述的那样使用env。现在,我只是把真正的路径awk。但它确实有效。谢谢使用/usr/bin/env是我处理不同系统在不同位置安装awk这一事实的方法。您可能希望从命令提示符下发出“which env”以找出env在您的系统中的位置。/usr/bin/env:awk-f:没有这样的文件或目录这是我收到的消息。env位于/usr/bin/env中。虽然您已经解决了我最初的问题,但我很想了解如何使用env。您是对的:它不起作用。我从我的Tcl脚本中复制了这一行:#/usr/bin/env tclsh该行适用于tclsh,但它不适用于awk,我对此感到困惑。