使用 ARGV 在 Awk 脚本中获取用户输入

使用 ARGV 在 Awk 脚本中获取用户输入

我知道ARGV[i]可以用于存储用户输入。但是,我想在 awk 脚本中使用它并比较ARGV[i]另一个文本文件中的字段。如果ARGV[i]匹配该字段或该字段包含ARGV[i]用户输入,那么我想返回该行的其他字段。

假设我有一个文件testing.txt

123123123:Walter White:1:2:3:4
123123124:Jesse Pinkman:1:3:4:1

这是我的 awk 脚本awkScript.awk

 #!/usr/bin/awk -f
    BEGIN{FS = ":"; print "ENTER A NAME: "}
    {
        for (i = 1; i < ARGC; i++)
        {   
            if ($2 ~ /'ARGV[i]'/)
            {
                print "Member ID: " $1
            }
        }
    }

当我执行脚本文件时,它只是打印 ENTER A NAME: 。它甚至没有得到用户的输入。

答案1

ARGV[i]为了匹配您需要将测试更改为的内容

if ($2 ~ ARGV[i])

否则,您正在测试与文字正则表达式的匹配,'ARGV[i]'这不是您想要的。

那么如果你像这样运行你的脚本就会(有点)工作:

awk -f qtest.awk testing.txt "Jesse Pinkman" "Walter White"

但是,当它完成读取testing.txt并尝试打开文件“Jesse Pinkman”时,它会抛出错误(当然,除非您碰巧有一个具有该名称的文件)。

换句话说,ARGV 包含文件名由 shell 传递给您的脚本,您不应该尝试使用它来传递任意参数。将非文件参数传递给 awk 脚本的常用方法是使用语法-v var = val来初始化脚本中的变量。

但我怀疑这里更好的方法是读取 BEGIN 块中的testing.txt,使用语法getline var <namefile.txt,分割数据(使用split()函数),并将分割数据存储在二维数组中。然后,您的主处理循环可以读取名称(从文件或用户),然后您可以使用保存在数组中的数据来测试这些名称。

相关内容