• 本页内容

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