gpt4 book ai didi

linux - awk 并标记相同的模式

转载 作者:太空宇宙 更新时间:2023-11-04 05:56:50 24 4
gpt4 key购买 nike

我遗漏了一些关于 awk 模式匹配使用标志的信息 --

给定一个文件:

2019 foo
a
b
c
2019 bar
d
e
f
2019 foobar
g
h
i

我可以使用带有标志的 awk 并获得预期的输出 -- awk '/foo/{flag=1;next} /^[0-9]+/{flag=0} flag' file

 a
b
c
g
h
i

但是如果我排除下一个以包含匹配的模式,则不会打印任何内容。awk 是否从匹配的行继续?

使用另一种语法-- awk '/foo/,/2019/' file

2019 foo
2019 foobar

我期望 awk 在匹配之间(包括匹配)进行打印。我肯定在语法上遗漏了一些东西。

最佳答案

不要使用范围表达式,这样您就不必尝试理解它们。无论如何,标志始终是更好的选择,因为它更清晰且更易于自定义,请参阅 Is a /start/,/end/ range expression ever useful in awk? .

使用标志的代码可能应该如下所示:

$ awk 'NF==2{found=0} found; $2 ~ /foo/{found=1}' file
a
b
c
g
h
i

或者如果您真的喜欢原来的条件:

$ awk '/^[0-9]/{found=0} found; /foo/{found=1}' file
a
b
c
g
h
i

命名标志变量flag就像命名数字变量number,而不是它真正代表的任何内容(总计、平均值等)。不要这样做 - 根据标记变量代表的数据来命名它们,在这种情况下,您找到与目标正则表达式匹配的行。当人们将标志变量缩写为 f 时,这是 found 的缩写,而不是 flag

关于linux - awk 并标记相同的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59294443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com