请帮助我理解以下 awk 命令:
awk -v var1=$1 -v var2=$2 '$1 ~ var1 && $2 ~ var2; /^var1 var2/' $READ_FILE | awk '{print $3}'
我在帖子中看到了这个命令:awk 命令接受两个变量作为参数并返回一个值
$1 ~ var1 && $2 ~ var2; /^var1 var2/
上面命令中“”的目的是什么。
请帮助我理解以下 awk 命令:
awk -v var1=$1 -v var2=$2 '$1 ~ var1 && $2 ~ var2; /^var1 var2/' $READ_FILE | awk '{print $3}'
我在帖子中看到了这个命令:awk 命令接受两个变量作为参数并返回一个值
$1 ~ var1 && $2 ~ var2; /^var1 var2/
上面命令中“”的目的是什么。
它应该是:
awk -v var1="$1" -v var2="$2" '$1 ~ var1 && $2 ~ var2; /^var1 var2/' "$READ_FILE"
这意味着里面的 awkvar1
变成了 shell 变量$1
,var2
变成了$2
. 在 awk 内部(在单引号内)还有$1
and $2
,它们表示输入文件中每一行的字段 1 和字段 2。如果第一个字段 ( $1
) 如果与字符串 in 中的正则表达式匹配,var1
同样 for $2
and var2
,则$1 ~ var1 && $2 ~ var2
计算结果为 1 并打印输入文件的相应行。
/^var1 var2/
表示如果一行以字符串“var1 var2”开头,则打印该行(可能意味着打印标题)...
虽然仍在为您的链接中指定的目的工作。
编辑:正如我刚刚看到的那样,您的链接条目似乎同时已修复。
该命令实际上有点过于复杂,并且(在一定程度上)甚至不正确,正如您已经怀疑的那样。
要了解线路线$1 ~ var1 && $2 ~ var2; /^var1 var2/
的用途,您必须首先了解两个重要事实。
awk
将打印匹配的整行,即使没有明确的打印语句;
要测试的机器人参数通过-v
开关传入,一个获取 awk 变量var1
,另一个获取 awk 变量var2
$1 ~ var1 && $2 ~ var2
将测试第一个字段是否与存储在var1中的正则表达式(这里是相关运算符)匹配(这就是&&
运算符的用途~
)和第二个字段是否与存储在 var2 中的正则表达式匹配。
第二个陈述/^var1 var2/
是多余的,也是不正确的。因为这将匹配以文字“var1”开头的行,后跟文字字符串 var2。
在给出的示例中它不会造成太大的伤害,因为它不会以任何方式匹配,但它仍然不正确。
使用正则表达式匹配运算符~
而不是使用相等性测试==
是建议的解决方案添加的另一个“不清晰”。
我的建议是只使用:
awk -v var1="$1" -v var2="$2" '$1==var1 && $2==var2 {print $3}' your-file-here
甚至不遗余力地打开另一个管道,只是为了打印存储在字段号 3 中的值。