请帮助我理解下面的awk命令:
awk -v var1=$1 -v var2=$2 '$1 ~ var1 && $2 ~ var2; /^var1 var2/' $READ_FILE | awk '{print $3}'我在帖子中看到了这个命令:awk command to accept two variables as parameters and return a value
上面命令中'$1 ~ var1 && $2 ~ var2; /^var1 var2/‘的用途是什么?
发布于 2013-03-20 00:39:44
它应该是:
awk -v var1="$1" -v var2="$2" '$1 ~ var1 && $2 ~ var2; /^var1 var2/' "$READ_FILE"这意味着在awk内部,var1将成为外壳变量$1,var2将成为$2。在awk内部(在单引号内),还有$1和$2,它们表示输入文件中每一行上的字段1和字段2。如果第一个字段($1)与var1中字符串中的正则表达式匹配,$2和var2也是如此,则$1 ~ var1 && $2 ~ var2的计算结果为1,并打印输入文件的相应行。
/^var1 var2/表示如果一行以字符串"var1 var2“开头,则打印该行(可能是打印标题)……
发布于 2013-03-20 00:48:20
同时仍在为您的链接中指定的目的工作。
编辑:就像我刚才看到的,你的链接条目似乎已经被修复了。
该命令实际上有点过于复杂,而且(在某种程度上)甚至不正确,正如您已经怀疑的那样。
要理解行$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甚至sparing打开另一个管道只是为了打印存储在字段3中的值。
https://stackoverflow.com/questions/15503035
复制相似问题