Can you summarize the following document?
        
  AWK程式是由一系列模式--動作對組成的,寫做  其中codice_1表示AWK在資料中查詢的內容,而codice_2是在找到匹配內容時所執行的一系列命令。輸入行被分成了一些記錄:記錄預設由換行符分割,因此輸入會按照行進行分割。程式使用給定的條件一個個的測試每條記錄,並執行測試通過的條件所對應的codice_2。codice_1和codice_2都可以省略不寫。無codice_1預設匹配全部的記錄;而無codice_2則是列印原始記錄。簡單的AWK表示式之外,codice_1可以是codice_9或codice_10;這兩種條件對應的codice_2分別是讀取所有的記錄之前和之後。同時,如codice_12的條件表示符合條件codice_13和codice_14的記錄及其之間的部分。  除了一般的,C語言風格的算術和邏輯運算子外,AWK允許運算子"~",用來測試正規表示式是否可以與一字串匹配。作為語法糖,沒有"~"運算子的正規表示式會被用來對當前記錄進行測試,相當於codice_15。

  AWK命令即為前文例子中以"action"指代的語句。AWK命令可以包括函式呼叫,變數賦值,計算,及/或各項的組合。標準AWK提供了許多內建函式;其部分實現則可能提供了更多的內建函式。同時,AWK的部分實現支援動態連結庫,使得其可以支援更多的函式。 便利起見,下述例子中可能省略大括號("{ }")。

  "print "命令用於輸出文字。其輸出的文字總是以"輸出記錄分隔符"(Output record separator, ORS)分割的,其預設值為換行符。該命令的最簡形式為:  雖然域的符號("$X ")可能類似於某些語言中的變數(例如PHP和perl),但在AWK中,它們指代的是當前記錄的域。另外,"$0"是指整個記錄。事實上,命令codice_16和codice_17的效果是相同的。 "print"命令也可以顯示變數、計算、函式呼叫的結果:  其輸出可以重定向到File:  或重定向到管道:

  AWK的內建變數包括域變數,例如$1, $2, $3,以及$0。這些變數給出了記錄中域的內容。 內建變數也包括一些其他變數:

  變數名可以是語言關鍵字外的,只包含大小寫拉丁字母,數字和下劃線(“_”)的任意字。而操作符“+ - * /”則分別代表加,減,乘,除。簡單的將兩個變數(或字串常量)放在一起,則會將二者串接為一個字串。若二者間至少有一個是常量,則中間可以不加空格;但若二者均為變數,中間必須包括空格。字串常量是以雙引號(“"”)分隔的。語句無需以分號結尾。另外,註釋是以“#”開頭的。

  函式是以與C語言類似的方式定義的,以關鍵字codice_21開頭,後面跟函式名稱,引數列表和函式體。  上面的函式可以如此呼叫:  函式可以擁有其私有變數。其私有變數可以寫在引數列表之後,因為這些值會在呼叫函式時被忽略。通常可以在引數列表中引數和私有變數之間加入一些空格,用以區別“真正的”引數和私有變數。 函式宣告中,函式名和括號間可以有任意空格,但在呼叫時二者必須緊鄰。

  

  AWK的"hello world"程式為:  注意此處無需寫出codice_22語句,因為唯一的模式是codice_9。

  輸出長度大於80字元的行。注意模式的預設行為是輸出當前行。

  對輸入中的單詞進行計數,然後輸出行數,單詞數和字元數(類似wc)。  由於沒有提供模式,輸入的全部行都可以匹配該模式,因此對每行都會執行預定操作。注意codice_24的含義等同於codice_25。

  codice_26是數值codice_18的累加,而codice_18則是每條記錄中的最後一個域。codice_29是當前行中域的數量,例如,4。由於codice_30是第4個域的值,codice_18,在這種情況下等於codice_30,則當然是最後一個域的內容。事實上,codice_33是一個具有最高優先順序的一元運算子。(若一行沒有域,則有codice_29為0,而codice_35是整行:在這種情況下,要麼是空串,要麼只有空白符,因此其數值為0。)  檔案結束時,codice_10模式得到了匹配,因此可以輸出codice_26。然而,由於可能沒有輸入行,此時codice_26會沒有值,從而導致沒有輸出。因此,對其加0可以使AWK在這種情況下對其賦值,從而得到一個數值。這種方法是將字串強制轉化為數值的慣用法(反之,與空串連線則是將數值強制轉換為字串的方法,例如codice_39)。如此處理之後,若程式輸入為空檔案,可以得到“0”作為輸出,而不是一個空行。

  $ yes Wikipedia | awk 'NR % 4 == 1, NR % 4 == 3 { printf "%6d %s\n", NR, $0 }' | sed 7q  yes命令重複輸入其引數(預設則是輸出“y”)。在這裡,我們讓該命令輸出“Wikipedia”。動作塊則輸出帶行號的內容。codice_40函式可以模擬標準C中的codice_40函式,其效果與前述的codice_16函式類似。而符合模式的行是這樣產生的:codice_43是記錄的編號,也就是AWK正在處理行的行號(從1開始)。“%”是取餘數操作符。因此,codice_44對第1,5,9等行為真。類似的,codice_45對3,7,11等行為真。範圍模式在其第一部分匹配(例如對第1行)之前為假,並在第二部分匹配(例如第3行)之前為真。然後,再在第二次匹配上其第一部分(例如第5行)前為假。codice_46命令則是用於擷取其前7行輸出,防止codice_47命令一直執行下去。若codice_48命令可用的話,這行命令的效果和codice_49相同。 若範圍模式的第一部分永遠為真,例如設定為“1”,可以用來使該範圍從輸入的最開始開始。類似的,若第二部分總是為假,例如“0”,則該範圍的結束即為輸入的結束。 命令  會輸出從符合正規表示式“^--cut here--$”開始的輸入行,也即從只包含“--cut here--”的行開始,直到輸入的結束。

  使用關聯陣列計算詞頻:  codice_9塊設定域分隔符為任意非字母字元。值得注意的是,分隔符不僅可以是字串,也可以是正規表示式。然後,程式對每個輸入行執行相同的操作。在此,對每個域,我們累加其小寫形式出現的次數。最後,在codice_10塊中,我們輸出單詞及其出現的次數。程式碼  建立了一個遍歷關聯陣列中元素的迴圈,其中,codice_52會被設為對應的鍵。這一點和多數語言不同,而和Objective-C 2.0中的codice_53語法相似。這樣的語法允許以簡單的方式遍歷陣列,從而輸出這些單詞。另外,codice_54函式是One True awk(見下文)的附加函式。

  這個程式可以以多種不同形式出現。第一個使用Bourne shell指令碼來完成大部分工作。這也是最短的一個方法:  awk命令中的codice_55並沒有為引號所保護。在這裡,模式可以檢查輸入行(codice_35)是否與之匹配。codice_57變數則包含了當前的檔名。awk沒有顯式的字串連線操作符;與BASH相似,只需簡單的將字串並列即可。codice_35則會輸出原始的輸入行。 也有另外的方法來完成同樣的任務。下面的指令碼直接在awk中訪問環境變數。  這個指令碼用到了陣列codice_59,一個One True awk中引入的量。其作用類似與POSIX標準中的getenv (3)函式。這個指令碼先建立了一個名為codice_1的環境變數,其值為指令碼的第一個引數,然後讓awk在其餘的引數所代表的檔案內尋找該模式。 codice_61是用於檢查其兩個運算元是否匹配的運算子;其逆則為codice_62。注意正規表示式也屬於普通的字串,可以儲存於變數中。 下面的方法則採用了在命令列對變數賦值的方法,即在awk的引數中寫入一個變數的值:  最後,這種方法是純awk的,無需shell的幫助,也無需知道太多關於awk指令碼實現的細節(而在命令列對變數賦值的方法可能與awk的實現相關);但這種方法的指令碼有點長:  codice_9塊的作用不僅僅是提取出第一個引數,也防止第一個引數在codice_9塊結束後直接被解釋為輸入檔案。codice_65,輸入引數的數量永遠是不小於1的,因為codice_66是執行指令碼的命令名,通常是codice_67。另外,codice_68永遠是空串。對於其中的codice_69塊,它表明若沒有指定輸入檔案,awk會直接讀取標準輸入流(codice_70)。也即  也可以工作,因為程式中已經將codice_65置為了2;若該值為1,則awk會認為沒有檔案需要讀取而直接退出。同時,若需從標準輸入讀取資料,需要將檔名顯式的指定為codice_72。

  與許多其他的程式語言相似,可以利用“shebang”語法構建自包含的awk指令碼。 例如,一個名為codice_73,可以輸出“Hello, world!”的UNIX命令可以通過建立內容如下,名為codice_73的檔案來完成:  codice_75引數告訴awk將該檔案作為awk的程式檔案,然後即可執行該程式。
AWK是一種優良的文字處理工具,Linux及Unix環境中現有的功能最強大的資料處理引擎之一。這種程式設計及資料操作語言(其名稱得自於它的創始人阿爾佛雷德·艾侯、彼得·溫伯格和布萊恩·柯林漢姓氏的首個字母)的最大功能取決於一個人所擁有的知識。AWK提供了極其強大的功能:可以進行正規表示式的匹配,樣式裝入、流控制、數學運算子、程序控制語句甚至於內建的變數和函式。它具備了一個完整的語言所應具有的幾乎所有精美特性。實際上AWK的確擁有自己的語言:AWK程式設計語言,三位建立者已將它正式定義為“樣式掃描和處理語言”。它允許建立簡短的程式,這些程式讀取輸入檔案、為資料排序、處理資料、對輸入執行計算以及生成報表,還有無數其他的功能。gawk是AWK的GNU版本。