2

请帮助我理解以下 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/上面命令中“”的目的是什么。

4

2 回答 2

4

它应该是:

awk -v var1="$1" -v var2="$2" '$1 ~ var1 && $2 ~ var2; /^var1 var2/' "$READ_FILE"

这意味着里面的 awkvar1变成了 shell 变量$1var2变成了$2. 在 awk 内部(在单引号内)还有$1and $2,它们表示输入文件中每一行的字段 1 和字段 2。如果第一个字段 ( $1) 如果与字符串 in 中的正则表达式匹配,var1同样 for $2and var2,则$1 ~ var1 && $2 ~ var2计算结果为 1 并打印输入文件的相应行。

/^var1 var2/表示如果一行以字符串“var1 var2”开头,则打印该行(可能意味着打印标题)...

于 2013-03-19T16:39:43.860 回答
-1

虽然仍在为您的链接中指定的目的工作。

编辑:正如我刚刚看到的那样,您的链接条目似乎同时已修复。

该命令实际上有点过于复杂,并且(在一定程度上)甚至不正确,正如您已经怀疑的那样。

要了解线路线$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 中的值。

于 2013-03-19T16:48:19.540 回答