awk匹配列中的多个模式

时间:2017-09-10 21:46:11

标签: awk

在一列中匹配多个模式的正确error saving obj: { "data": { "asset": { "value": "{\"value\":{\"href\":\"http://localhost:8080/restful/objects/businessentities.Asset/36\"}}", "invalidReason": "Expected a link (because this object's type is not a value) but found no 'href'" }, "location": { "value": "{\"value\":{\"href\":\"http://localhost:8080/restful/objects/businessentities.Location/47\"}}", "invalidReason": "Expected a link (because this object's type is not a value) but found no 'href'" }, "x-ro-invalidReason": "Mandatory" }, 语法是什么?有一个像这样的柱状文件:

awk

如何排除第二列中与c21和c22匹配的行。

使用c11 c21 c31 c12 c22 c32 c13 c23 c33 ,可以执行类似的操作(但它并未指定仅在第二列中匹配):

grep

我尝试使用> egrep -w -v "c21|c22" bar.txt c13 c23 c33 ,但无济于事:

awk

那么,正确的> awk '$2 != /c21|c22/' bar.txt c11 c21 c31 c12 c22 c32 c13 c23 c33 > awk '$2 != "c21" || $2 != "c22"' bar.txt c11 c21 c31 c12 c22 c32 c13 c23 c33 语法是什么才能做到这一点?

2 个答案:

答案 0 :(得分:6)

$2 != ($0 ~ /c21|c22/)

的简写
$2

将{0}与c21或c22进行比较的$2结果进行比较,结果为1或0,以便对1进行$2 != "c21" || $2 != "c22" 测试除$2以外的其他值。

c21

正在测试的$2不等于c22 $2 != "c21"不等于$2 != "c22",这是一个始终为真的条件。想一想 - 如果$ 2是c21那么第一个条件(or)是假的,但是第二个条件($2)是真的等等所以awk '$2 !~ /c21|c22/' 对任何一个都是真的价值awk '$2 !~ /^(c21|c22)$/'

你要写的是:

awk '$2 !~ /^c2[12]$/'

或更强大:

awk '!($2 == "c21" || $2 == "c22")'
awk '$2 != "c21" && $2 != "c22"'

更简单(加上同样强大)真正写出这个条件的方法是:

awk 'BEGIN{split("c21 c22",t); for (i in t) vals[t[i]]} !($2 in vals)'

如果你想做一个字符串而不是正则表达式比较那么你可以做其中任何一个如果它是一个一次性的脚本(我赞成第一个用于更少的否定标志,恕我直言使其更清楚):< / p>

$2

,否则:

{{1}}

最后一个是最好的,因为你只指定{{1}}一次,如果你需要测试更多,那么你可以在被拆分的字符串中添加其他值,这意味着你不能在以后的中断脚本。

答案 1 :(得分:1)

使用和(&&)代替或(||):

awk '$2 != "c21" && $2 != "c22"' bar.txt 

打印:

c13 c23 c33

由于c21不等于c22,因此第2列中带有c21的行将打印在||的版本中,因为对于具有c22的行,$ 2不等于c22,反之亦然。实际上,不可能不打印所有行都是不可能的,因为在第2行中,第2列都不等于c21和c22。