我只想在 awk 中实现 if 条件。我创建了一个文件名:“simple_if”,如下所示。
BEGIN{
num=$1;
if (num%2==0)
printf "%d is Even number.\n",num;
else printf "%d is odd Number.\n",num
}
然后我通过传递 10 作为 $1 的参数来执行程序,如下所示
awk -f simple_if 10
但它不接受输入,而是显示 0。输出:
0 is Even number.
如何在awk中从用户那里获得价值?
在命令行末尾给出的参数
awk
通常被视为awk
脚本将从中读取的文件名。要在命令行上设置变量,请使用-v variable=value
,例如这将使您能够
num
在脚本中用作变量。在上面的示例中,变量的初始值为 10。您还可以
ENVIRON["variable"]
在脚本中读取环境变量(对于一些名为 的环境变量variable
),或者查看命令行参数,ARGV[n]
其中n
是某个正整数。使用
$1
inawk
,您将引用当前记录中第一个字段的值,但由于您在BEGIN
块中使用它,因此尚未从任何文件中读取任何数据。您的代码中的数字被解释为零,因为它是在算术上下文中使用的空变量。
$1
不是第一个命令行参数,而是该行之后的第一个字段被拆分FS
(并且它将是 中的空字符串BEGIN
,因为还没有拆分行)。命令行参数在数组中
ARGV
:ARGV[0]
始终是解释器的名称(awk
或gawk
等)。为了让
awk
忽略命令行参数并且以后不尝试将其作为文件打开,您应该将其删除或将其设置为空字符串:例如。ARGV[1]=""
.作为旁注,表单的任何参数
var=value
也将被解释为变量赋值awk
,并将在处理之前的文件参数后进行评估:要使用表单的实际文件名
key=val
,awk
您应该将其作为相对或绝对路径传递,例如。awk '{...}' ./key=val
.正如已经指出的那样,在 BEGIN 部分中没有读取任何输入。如果您检查第一行输入并在标准输入上提供数字,您可以使您的代码按预期执行:
常规 awk 处理命令行参数没有任何问题,就像任何其他类 C 程序一样,无需诉诸任何 GNU特定的
gawk
行为、管道或重定向 (<
) 或-v
(variable assignment) 选项。输入参数的处理,
ARGC
(参数计数,整数)和ARGV
(参数向量,“列表”的另一个词)都在手册中详细介绍。Mosvy 很好地解释了背景,并总结了解析
ARGV
. 这是您最初的目标,作为独立的 shell 脚本实现,在 macOS 和 GNU/Linux 上进行了测试。simple_if.awk
用 制作一个像这个可执行文件这样的awk 脚本
chmod a+x scriptname.awk
,把它放在你的$PATH
.如果
awk
存在于系统的其他位置,请#!
适当更新该行;它可能无法使用/usr/bin/env
,因为awk
必须具有-f
运行脚本的选项,而且……它很复杂。扩展根本
.awk
不是必需的,但它可以帮助您的编辑器启用正确的语法突出显示。把它关掉,甚至没有人需要知道它是一个 awk 脚本。这是一个更完整的示例,它做了一些有用的事情,并且有合理的错误处理:
simple_stats.awk