AWK-字符串表达式

AWK-字符串表达式,awk,Awk,我有一个正则表达式的示例: seq 20 | awk 'NR!~/^2$|^12$|^15$/' seq 20 | awk 'NR != "2" && NR != "12" && NR != "15"' 相同,但使用链表达式: seq 20 | awk 'NR!~/^2$|^12$|^15$/' seq 20 | awk 'NR != "2" && NR != "12" && NR != "15"' 是否可以编写较短的字符串

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

seq 20 | awk 'NR!~/^2$|^12$|^15$/'
seq 20 | awk 'NR != "2" && NR != "12" && NR != "15"'
相同,但使用链表达式:

seq 20 | awk 'NR!~/^2$|^12$|^15$/'
seq 20 | awk 'NR != "2" && NR != "12" && NR != "15"'
是否可以编写较短的字符串表达式

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

谢谢你的解释。

据我所知不是这样。正如您所暗示的,如果您希望以这种方式执行相等性测试(在本例中是不等性测试),则需要使用正则表达式

如果有多个值要忽略,请考虑在<代码>开始> /COD>块中使用数组。当

awk
遍历每一行时,这将使表达式变短(即表达式现在只是:
!(数组中的NR)
):

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

如果您试图忽略的行有某种模式,请考虑使用<代码> <代码>循环> <代码>开始/代码>块:

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

16
17
18
19
20

seq 20 | awk'BEGIN{for(i=1;i第一个可能是最短的,如果您将锚点放在组之外,它会更短
()


我想OP想要所有行号不以2、12、15结尾的行。好吧,seq 20可能是个坏例子。试试seq 200或seq 1000。你的第一个解决方案会把102行打印出来,对吗?@Kent:我想他只是想找到一个较短的表达式。我不认为他想找到行号不以2、12或15结尾的行。也许值得重读这篇文章估计:-)