我知道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()
函数),并将分割数据存储在二维数组中。然后,您的主处理循环可以读取名称(从文件或用户),然后您可以使用保存在数组中的数据来测试这些名称。