AWK字符串表达式

时间:2012-10-13 06:54:18

标签: awk

我有一个正则表达式的例子:

seq 20 | awk 'NR!~/^2$|^12$|^15$/'

同样,但链表达式:

seq 20 | awk 'NR != "2" && NR != "12" && NR != "15"'

是否可以编写更短的字符串表达式?

seq 20 | awk 'NR != "2" | "12" | "15" '

感谢您的解释。

2 个答案:

答案 0 :(得分:2)

据我所知。就像你已经暗示的那样,如果你想以这种方式进行相等性测试(或者在这种情况下进行不等式测试),你将需要使用正则表达式。

如果要忽略多个值,请考虑在BEGIN块中使用数组。当!(NR in array)遍历每一行时,这将使表达式更短(即表达式现在只是:awk):

seq 20 | awk 'BEGIN { array[2]++; array[12]++; array[15]++ } !(NR in array)'

结果:

1
3
4
5
6
7
8
9
10
11
13
14
16
17
18
19
20

如果您尝试忽略的行存在某种模式,请考虑在for块中使用BEGIN循环:

seq 20 | awk 'BEGIN { for (i=1; i<=15; i++) array[i]++ } !(NR in array)'

16
17
18
19
20

答案 1 :(得分:1)

第一个可能是最短的,如果你将锚点留在一个组()之外会更短:

seq 20 | awk 'NR !~ /^(2|12|15)$/'