2017-03-31 39 views
1

我想了解的震盪格局在awk中 這裏的匹配如何工作的是我與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 

什麼是這裏的行爲嗎?爲什麼我不會在第一個英格蘭呢?

回答

1

Awk一次處理一個輸入行,您使用的語法爲,可能是以打印從開始行到結束行的行,由國家名錶示。當您使用

awk '/Asia/, /Europe/' 

模式Asia的開始發生不止一次。正如您從以下行號中看到的,數字3,5,811代表模式的開始,模式在行1012處結束。仔細觀察8-1011-12之間的線的子範圍。 last end pattern Europe最後的Asia結束於12,這就是您在第一種情況下沒有看到England的原因。

但是,當你使用

awk '/Europe/, /Asia/' 

包含第一開始圖案在行10Europe開頭的行和在1112另外兩個模式的開始和13而不結束模式Asia結束,所以這將顯然打印所有行,直到出現Asia。所以你在第二種情況下看到England。因爲他們使瑣碎的任務非常輕微簡短但隨後需要一個完全重寫或複製的條件時,你的要求改變

$ cat -n file 
1 Raw Data 
2 ----------------------------------------- 
3  USSR 8649 275  Asia 
4  Canada 3852 25  North America 
5  China 3705 1032 Asia 
6  USA  3615 237  North America 
7  Brazil 3286 134  South America 
8  India 1267 746  Asia 
9  Mexico 762  78  North America 
10  France 211  55  Europe 
11  Japan 144  120  Asia 
12  Germany 96  61  Europe 
13  England 94  56  Europe 
+0

@Adaptron:請參閱[我應該怎麼做當有人回答我的問題](http://stackoverflow.com/help/someone-answers) – Inian

0

切勿使用範圍表達式。始終使用標誌來代替:

awk '/Asia/{f=1} f{print} /Europe/{f=0}' countries.awk 

我敢打賭,如果你開始使用,你甚至不會有問這個問題的邏輯是清晰和明確。