我只想在 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
}
Run Code Online (Sandbox Code Playgroud)
然后我通过将 10 作为参数传递给 $1 来执行程序,如下所示
awk -f simple_if 10
Run Code Online (Sandbox Code Playgroud)
但它不接受输入而是显示 0。输出:
0 is Even number.
Run Code Online (Sandbox Code Playgroud)
如何在awk中从用户那里获得价值?
Kus*_*nda 20
在命令行末尾给出的参数awk
通常被视为awk
脚本将从中读取的文件名。要在命令行上设置变量,请使用-v variable=value
,例如
awk -v num=10 -f script.awk
Run Code Online (Sandbox Code Playgroud)
这将使您能够num
在脚本中用作变量。在上面的例子中,变量的初始值是 10。
您还可以ENVIRON["variable"]
在脚本中使用读取环境变量(对于某些名为 的环境变量variable
),或者查看命令行参数,ARGV[n]
其中 wheren
是某个正整数。
使用$1
in awk
,您将引用当前记录中第一个字段的值,但由于您在BEGIN
块中使用它,因此尚未从任何文件中读取任何数据。
代码中的数字被解释为零,因为它是在算术上下文中使用的空变量。
mos*_*svy 14
$1
不是第一个命令行参数,而是该行被分割后的第一个字段FS
(它将是 中的空字符串BEGIN
,因为尚未分割任何行)。
命令行参数在数组中ARGV
:
$ awk 'BEGIN { for(i = 1; i < ARGC; i++) print ARGV[i] }' 1st 2nd 3rd
1st
2nd
3rd
Run Code Online (Sandbox Code Playgroud)
ARGV[0]
始终是解释器的名称(awk
或gawk
等)。
为了让awk
忽略命令行参数并且不尝试稍后将其作为文件打开,您应该将其删除或将其设置为空字符串:例如。ARGV[1]=""
.
作为旁注,表单的任何参数var=value
也将被解释为变量赋值awk
,并将在处理它之前的文件参数后进行评估:
$ echo yes > file
$ awk '{ gsub(/e/, var); print }' var=1 file var=2 file var=3 file
y1s
y2s
y3s
Run Code Online (Sandbox Code Playgroud)
若要使用形式的实际文件名key=val
用awk
,你应该把它作为一个相对或绝对路径如。awk '{...}' ./key=val
.