【发布时间】:2019-09-17 03:31:52
【问题描述】:
我刚刚阅读了Can awk patterns match multiple lines?,其接受的解决方案是打印first half 之后的行的脚本。
how
second half #1
now
first half
second half #2
brown
second half #3
cow
/second half/ {
if(lastLine == "first half") {
print
}
}
{ lastLine = $0 }
这给出了second half #2。
我无法理解为什么{ lastLine = $0 } 必须追随 /second half/ {...}/。我尝试交换它们,但我什么都没有。
{ lastLine = $0 }
/second half/ {
if(lastLine == "first half") {
print
}
}
我尝试阅读 man awk,但它不涵盖状态机。搜索“awk 状态机”只会给出链接的 SO 问题。
【问题讨论】:
-
if 语句引用变量lastLine,所以很明显lastLine 是在if 之前还是之后获取它的值(除非我根本不理解你的问题)。
-
在第二个脚本中,
lastLine获得了if之前的值,但我不明白为什么没有打印出来。 -
在第二个脚本中,
lastLine设置为当前行(即$0),只有当当前行匹配second half时才会执行其后的动作。在操作中,检查lastLine变量是否为first half,结果始终为false,因为second half ...=/=first half。因此没有任何内容被打印出来。 -
看,在第一个脚本
lastLine保留最后一行,但第二个保留当前行,好吗?因为在第一个,它被分配之后检查它是否是first half,在第二个,它被分配之前检查它是否是first half。 -
如何写一个状态机是一般编程的事情,不是awk的事情。见en.wikipedia.org/wiki/Finite-state_machine(如果你关心的话,还有一个非常年轻的男人和他的同龄人在ieeexplore.ieee.org/document/6772875发表的一篇非常古老的论文:-))
标签: awk