Awk的字符串模式匹配如何工作?

时间:2017-03-31 20:12:41

标签: awk gawk

我试图了解范围模式匹配在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

这里的行为是什么?为什么我没有第一个获得英格兰?

2 个答案:

答案 0 :(得分:1)

Awk一次处理一个输入行,您使用的语法可能从开始到结束模式打印行,由国家/地区名称表示。当你使用

awk '/Asia/, /Europe/'

模式Asia的开始不止一次。从下面的行号可以看出,数字35811代表模式的开头,模式结束于第{{1}行}和10。请仔细观察128-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

我敢打赌,如果你开始这样做,你甚至不必问这个问题,因为逻辑清晰明确。