91. GAWK 字符串函数
参数处理
ARGC
、
ARGV
、
ARGIND
。
我们之前讨论的内置变量
FS
、
NFS
、
RS
、
NR
、
FILENAME
、
OFS
和
ORS
在所有版本的 awk(包括 nawk 和 gawk)上都可用。
- 本 hack 中讨论的环境变量仅在 nawk 和 gawk 上可用。
- 使用
ARGC
和ARGV
从命令行向 awk 脚本传递一些参数。 ARGC
包含传递给 awk 脚本的参数总数。ARGV
是一个数组,包含索引中从 0 到ARGC
传递给 awk 脚本的所有参数。- 当您传递 5
ARGC
将包含值 6。 ARGV[0]
将始终包含 awk。
以下简单的 「arguments.awk」 显示了
ARGC
和
ARGV
的行为方式:
$ cat arguments.awk
BEGIN {
print "ARGC=",ARGC
for (i = 0; i < ARGC; i++)
print ARGV[i]
}
$ awk -f arguments.awk arg1 arg2 arg3 arg4 arg5
ARGC= 6
awk
arg1
arg2
arg3
arg4
arg5
在以下示例中:
- 我们以
--paramname paramvalue
格式向脚本传递参数。 - awk 脚本可以将项目编号和数量作为参数。
- 如果您使用
--item 104 --qty 25
作为 awk 脚本的参数,它会将项目编号 104 的数量设置为 25。 - 如果您使用
--item 105 --qty 3
作为 awk 脚本的参数,它会将项目编号 105 的数量设置为 3。$ cat argc-argv.awk BEGIN { FS=","; OFS=","; for (i=0; i<ARGC; i++) { if (ARGV[i]=="--item") { itemnumber=ARGV[i+1]; delete ARGV[i] i++; delete ARGV[i] } else if (ARGV[i]=="--qty") { quantity=ARGV[i+1]; delete ARGV[i] i++; delete ARGV[i] } } } { if ($1==itemnumber) print $1,$2,$3,$4,quantity else print $0; } $ awk -f argc-argv.awk --item 104 --qty 25 items.txt 101,HD Camcorder,Video,210,10 102,Refrigerator,Appliance,850,2 103,MP3 Player,Audio,270,15 104,Tennis Racket,Sports,190,25 105,Laser Printer,Office,475,5
ARGC
ARGV
在 gawk 中,当前正在处理的文件存储在从主体循环访问的
ARGV
数组中。
ARGIND
是该
ARGV
数组的索引,用于检索当前文件。
当您在 awk 脚本中仅处理一个文件时,
ARGIND
将为 1,并且 ARGV[ARGIND]
将给出当前正在处理的文件名。
以下示例仅包含主体块,该块打印
ARGIND
的值以及 ARGV[ARGIND]
中的当前文件名。
$ cat argind.awk
{
print "ARGIND:", ARGIND
print "Current file:", ARGV[ARGIND]
}
当您使用两个文件调用上面的示例时,在处理输入文件的每一行时,它将打印这两行。
这只是让您了解
ARGIND
和 ARGV[ARGIND]
中存储的内容。
$ awk -f argind.awk items.txt items-sold.txt
ARGIND: 1
Current file: items.txt
ARGIND: 1
Current file: items.txt
ARGIND: 1
Current file: items.txt
ARGIND: 1
Current file: items.txt
ARGIND: 1
Current file: items.txt
ARGIND: 2
Current file: items-sold.txt
ARGIND: 2
Current file: items-sold.txt
ARGIND: 2
Current file: items-sold.txt
ARGIND: 2
Current file: items-sold.txt
ARGIND: 2
Current file: items-sold.txt