awk 中的命令行参数

Dip*_*Dip 11 command-line awk

我只想在 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是某个正整数。


使用$1in 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]始终是解释器的名称(awkgawk等)。

为了让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=valawk,你应该把它作为一个相对或绝对路径如。awk '{...}' ./key=val.