我试图了解范围模式匹配在Awk中的工作原理 以下是我正在练习的完整数据
Raw Data
-----------------------------------------
USSR 8649 275 Asia
Canada 3852 25 North America
China 3705 1032 Asia
USA 3615 237 North America
Brazil 3286 134 South America
India 1267 746 Asia
Mexico 762 78 North America
France 211 55 Europe
Japan 144 120 Asia
Germany 96 61 Europe
England 94 56 Europe
如果我写这段代码
$ awk '/Asia/, /Europe/' countries.awk
我得到了
USSR 8649 275 Asia
Canada 3852 25 North America
China 3705 1032 Asia
USA 3615 237 North America
Brazil 3286 134 South America
India 1267 746 Asia
Mexico 762 78 North America
France 211 55 Europe
Japan 144 120 Asia
Germany 96 61 Europe
它不输出英格兰。
如果我写这个
$ awk '/Europe/, /Asia/' countries.awk
我得到了
France 211 55 Europe
Japan 144 120 Asia
Germany 96 61 Europe
England 94 56 Europe
这里的行为是什么?为什么我没有第一个获得英格兰?
答案 0 :(得分:1)
Awk
一次处理一个输入行,您使用的语法可能从开始到结束模式打印行,由国家/地区名称表示。当你使用
awk '/Asia/, /Europe/'
模式Asia
的开始不止一次。从下面的行号可以看出,数字3
,5
,8
和11
代表模式的开头,模式结束于第{{1}行}和10
。请仔细观察12
和8-10
之间的线的子范围。最后11-12
的最后结束模式Europe
在第Asia
行结束,这就是您在第一种情况下没有看到12
的原因
但是当你使用
时England
包含第一个起始模式awk '/Europe/, /Asia/'
的行从第Europe
行开始,到10
结束,另外两个模式从11
开始,12
没有结束模式13
,因此显然会显示所有行,直到Asia
出现。所以你在第二种情况下看到Asia
。
England
答案 1 :(得分:0)
永远不要使用范围表达式,因为它们使得繁琐的任务变得非常简单,但是当您的需求发生变化时需要完全重写或复制条件。总是使用标志:
awk '/Asia/{f=1} f{print} /Europe/{f=0}' countries.awk
我敢打赌,如果你开始这样做,你甚至不必问这个问题,因为逻辑清晰明确。