Awk 是一個強大的工具,可以執行某些可能由其它常見實用程序(包括 sort)來完成的任務。
Awk 是個普遍存在的 Unix 命令,用于掃描和處理包含可預測模式的文本。但是,由于它具有函數功能,因此也可以合理地稱之為編程語言。
令人困惑的是,有不止一個 awk。(或者,如果你認為只有一個,那么其它幾個就是克隆。)有 awk(由Aho、Weinberger 和 Kernighan 編寫的原始程序),然后有 nawk 、mawk 和 GNU 版本的 gawk。GNU 版本的 awk 是該實用程序的一個高度可移植的自由軟件版本,具有幾個獨特的功能,因此本文是關于 GNU awk 的。
雖然它的正式名稱是 gawk,但在 GNU+Linux 系統上,它的別名是 awk,并用作該命令的默認版本。 在其他沒有帶有 GNU awk 的系統上,你必須先安裝它并將其稱為 gawk,而不是 awk。本文互換使用術語 awk 和 gawk。
awk 既是命令語言又是編程語言,這使其成為一個強大的工具,可以處理原本留給 sort、cut、uniq 和其他常見實用程序的任務。幸運的是,開源中有很多冗余空間,因此,如果你面臨是否使用 awk 的問題,答案可能是肯定的“隨便”。
awk 的靈活之美在于,如果你已經確定使用 awk 來完成一項任務,那么無論接下來發生什么,你都可以繼續使用 awk。這包括對數據排序而不是按交付給你的順序的永恒需求。
樣本數據集
在探索 awk 的排序方法之前,請生成要使用的樣本數據集。保持簡單,這樣你就不會為極端情況和意想不到的復雜性所困擾。這是本文使用的樣本集:
Aptenodytes;forsteri;Miller,JF;1778;EmperorPygoscelis;papua;Wagler;1832;GentooEudyptula;minor;Bonaparte;1867;Little BlueSpheniscus;demersus;Brisson;1760;AfricanMegadyptes;antipodes;Milne-Edwards;1880;Yellow-eyedEudyptes;chrysocome;Viellot;1816;Sothern RockhopperTorvaldis;linux;Ewing,L;1996;Tux
這是一個很小的數據集,但它提供了多種數據類型:
屬名和種名,彼此相關但又是分開的 姓,有時是以逗號開頭的首字母縮寫 代表日期的整數 任意術語 所有字段均以分號分隔根據你的教育背景,你可能會認為這是二維數組或表格,或者只是行分隔的數據集合。你如何看待它只是你的問題,而 awk 只認識文本。由你決定告訴 awk 你想如何解析它。
只想排序
如果你只想按特定的可定義字段(例如電子表格中的“單元格”)對文本數據集進行排序,則可以使用 sort 命令。
字段和記錄
無論輸入的格式如何,都必須在其中找到模式才可以專注于對你重要的數據部分。在此示例中,數據由兩個因素定界:行和字段。每行都代表一個新的記錄,就如你在電子表格或數據庫轉儲中看到的一樣。在每一行中,都有用分號(;)分隔的不同的字段(將其視為電子表格中的單元格)。
awk 一次只處理一條記錄,因此,當你在構造發給 awk 的這指令時,你可以只關注一行記錄。寫下你想對一行數據執行的操作,然后在下一行進行測試(無論是心理上還是用 awk 進行測試),然后再進行其它的一些測試。最后,你要對你的 awk 腳本要處理的數據做好假設,以便可以按你要的數據結構提供給你數據。
在這個例子中,很容易看到每個字段都用分號隔開。為簡單起見,假設你要按每行的第一字段對列表進行排序。
在進行排序之前,你必須能夠讓 awk 只關注在每行的第一個字段上,因此這是第一步。終端中 awk 命令的語法為 awk,后跟相關選項,最后是要處理的數據文件。
$ awk --field-separator=";" '{print $1;}' penguins.listAptenodytesPygoscelisEudyptulaSpheniscusMegadyptesEudyptesTorvaldis
新聞熱點
疑難解答