婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 幫助你排序文本文件的 Awk 命令行或腳本(推薦)

幫助你排序文本文件的 Awk 命令行或腳本(推薦)

熱門標簽:長春電銷外呼系統代理商 大連電銷外呼系統運營商 接電話機器人罵人 400電話干嘛怎么申請信用卡 外呼系統虛擬號碼 代理外呼系統創業 400電話申請知乎 百度地圖標注尺寸無法顯示 泰州智能外呼系統排名

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;Emperor
Pygoscelis;papua;Wagler;1832;Gentoo
Eudyptula;minor;Bonaparte;1867;Little Blue
Spheniscus;demersus;Brisson;1760;African
Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyed
Eudyptes;chrysocome;Viellot;1816;Sothern Rockhopper
Torvaldis;linux;Ewing,L;1996;Tux

這是一個很小的數據集,但它提供了多種數據類型:

  • 屬名和種名,彼此相關但又是分開的
  • 姓,有時是以逗號開頭的首字母縮寫
  • 代表日期的整數
  • 任意術語
  • 所有字段均以分號分隔

根據你的教育背景,你可能會認為這是二維數組或表格,或者只是行分隔的數據集合。你如何看待它只是你的問題,而 awk 只認識文本。由你決定告訴 awk 你想如何解析它。

只想排序

如果你只想按特定的可定義字段(例如電子表格中的“單元格”)對文本數據集進行排序,則可以使用 sort 命令。

字段和記錄

無論輸入的格式如何,都必須在其中找到模式才可以專注于對你重要的數據部分。在此示例中,數據由兩個因素定界:行和字段。每行都代表一個新的記錄,就如你在電子表格或數據庫轉儲中看到的一樣。在每一行中,都有用分號(;)分隔的不同的字段(將其視為電子表格中的單元格)。

awk 一次只處理一條記錄,因此,當你在構造發給 awk 的這指令時,你可以只關注一行記錄。寫下你想對一行數據執行的操作,然后在下一行進行測試(無論是心理上還是用 awk 進行測試),然后再進行其它的一些測試。最后,你要對你的 awk 腳本要處理的數據做好假設,以便可以按你要的數據結構提供給你數據。

在這個例子中,很容易看到每個字段都用分號隔開。為簡單起見,假設你要按每行的第一字段對列表進行排序。

在進行排序之前,你必須能夠讓 awk 只關注在每行的第一個字段上,因此這是第一步。終端中 awk 命令的語法為 awk,后跟相關選項,最后是要處理的數據文件。

$ awk --field-separator=";" '{print $1;}' penguins.list
Aptenodytes
Pygoscelis
Eudyptula
Spheniscus
Megadyptes
Eudyptes
Torvaldis

因為字段分隔符是對 Bash shell 具有特殊含義的字符,所以必須將分號括在引號中或在其前面加上反斜杠。此命令僅用于證明你可以專注于特定字段。你可以使用另一個字段的編號嘗試相同的命令,以查看數據的另一個“列”的內容:

$ awk --field-separator=";" '{print $3;}' penguins.list
Miller,JF
Wagler
Bonaparte
Brisson
Milne-Edwards
Viellot
Ewing,L

我們尚未進行任何排序,但這是良好的基礎。

腳本編程

awk 不僅僅是命令,它是一種具有索引、數組和函數的編程語言。這很重要,因為這意味著你可以獲取要排序的字段列表,將列表存儲在內存中,進行處理,然后打印結果數據。對于諸如此類的一系列復雜操作,在文本文件中進行操作會更容易,因此請創建一個名為 sort.awk 的新文件并輸入以下文本:

#!/bin/gawk -f
BEGIN {
    FS=";";
}

這會將該文件建立為 awk 腳本,該腳本中包含執行的行。

BEGIN 語句是 awk 提供的特殊設置功能,用于只需要執行一次的任務。定義內置變量 FS,它代表字段分隔符field separator,并且與你在 awk 命令中使用 --field-separator 設置的值相同,它只需執行一次,因此它包含在 BEGIN 語句中。

awk 中的數組

你已經知道如何通過使用 $ 符號和字段編號來收集特定字段的值,但是在這種情況下,你需要將其存儲在數組中而不是將其打印到終端。這是通過 awk 數組完成的。awk 數組的重要之處在于它包含鍵和值。 想象一下有關本文的內容;它看起來像這樣:author:"seth",title:"How to sort with awk",length:1200。諸如作者、標題和長度之類的元素是鍵,跟著的內容為值。

在排序的上下文中這樣做的好處是,你可以將任何字段分配為鍵,將任何記錄分配為值,然后使用內置的 awk 函數 asorti()(按索引排序)按鍵進行排序。現在,隨便假設你只想按第二個字段排序。

沒有被特殊關鍵字 BEGIN 或 END 引起來的 awk 語句是在每個記錄都要執行的循環。這是腳本的一部分,該腳本掃描數據中的模式并進行相應的處理。每次 awk 將注意力轉移到一條記錄上時,都會執行 {} 中的語句(除非以 BEGIN 或 END 開頭)。

要將鍵和值添加到數組,請創建一個包含數組的變量(在本示例腳本中,我將其稱為 ARRAY,雖然不是很原汁原味,但很清楚),然后在方括號中分配給它鍵,用等號(=)連接值。

{  # dump each field into an array
  ARRAY[$2] = $R;
}

在此語句中,第二個字段的內容($2)用作關鍵字,而當前記錄($R)用作值。

asorti() 函數

除了數組之外,awk 還具有一些基本函數,你可以將它們用作常見任務的快速簡便的解決方案。GNU awk中引入的函數之一 asorti() 提供了按鍵(索引)或值對數組進行排序的功能。

你只能在對數組進行填充后對其進行排序,這意味著此操作不能對每個新記錄都觸發,而只能在腳本的最后階段進行。為此,awk 提供了特殊的 END 關鍵字。與 BEGIN 相反,END 語句僅在掃描了所有記錄之后才觸發一次。

將這些添加到你的腳本:

END {
  asorti(ARRAY,SARRAY);
  # get length
  j = length(SARRAY);
  
  for (i = 1; i <= j; i++) {
    printf("%s %s\n", SARRAY[i],ARRAY[SARRAY[i]])
  }
}

asorti() 函數獲取 ARRAY 的內容,按索引對其進行排序,然后將結果放入名為 SARRAY 的新數組(我在本文中發明的任意名稱,表示“排序的 ARRAY”)。

接下來,將變量 j(另一個任意名稱)分配給 length() 函數的結果,該函數計算 SARRAY 中的項數。

最后,使用 for 循環使用 printf() 函數遍歷 SARRAY 中的每一項,以打印每個鍵,然后在 ARRAY 中打印該鍵的相應值。

運行該腳本

要運行你的 awk 腳本,先使其可執行:

$ chmod +x sorter.awk

然后針對 penguin.list 示例數據運行它:

$ ./sorter.awk penguins.list
antipodes Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyed
chrysocome Eudyptes;chrysocome;Viellot;1816;Sothern Rockhopper
demersus Spheniscus;demersus;Brisson;1760;African
forsteri Aptenodytes;forsteri;Miller,JF;1778;Emperor
linux Torvaldis;linux;Ewing,L;1996;Tux
minor Eudyptula;minor;Bonaparte;1867;Little Blue
papua Pygoscelis;papua;Wagler;1832;Gentoo

如你所見,數據按第二個字段排序。

這有點限制。最好可以在運行時靈活選擇要用作排序鍵的字段,以便可以在任何數據集上使用此腳本并獲得有意義的結果。

添加命令選項

你可以通過在腳本中使用字面值 var 將命令變量添加到 awk 腳本中。更改腳本,以使迭代子句在創建數組時使用 var:

{ # dump each field into an array
  ARRAY[$var] = $R;
}

嘗試運行該腳本,以便在執行腳本時使用 -v var 選項將其按第三字段排序:

$ ./sorter.awk -v var=3 penguins.list
Bonaparte Eudyptula;minor;Bonaparte;1867;Little Blue
Brisson Spheniscus;demersus;Brisson;1760;African
Ewing,L Torvaldis;linux;Ewing,L;1996;Tux
Miller,JF Aptenodytes;forsteri;Miller,JF;1778;Emperor
Milne-Edwards Megadyptes;antipodes;Milne-Edwards;1880;Yellow-eyed
Viellot Eudyptes;chrysocome;Viellot;1816;Sothern Rockhopper
Wagler Pygoscelis;papua;Wagler;1832;Gentoo

修正

本文演示了如何在純 GNU awk 中對數據進行排序。你可以對腳本進行改進,以便對你有用,花一些時間在gawk 的手冊頁上研究 awk 函數并自定義腳本以獲得更好的輸出。

這是到目前為止的完整腳本:

#!/usr/bin/awk -f
# GPLv3 appears here
# usage: ./sorter.awk -v var=NUM FILE
BEGIN { FS=";"; }
{ # dump each field into an array
  ARRAY[$var] = $R;
}
END {
  asorti(ARRAY,SARRAY);
  # get length
  j = length(SARRAY);
  
  for (i = 1; i <= j; i++) {
    printf("%s %s\n", SARRAY[i],ARRAY[SARRAY[i]])
  }
}

總結

以上所述是小編給大家介紹的幫助你排序文本文件的 Awk 命令行或腳本,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

標簽:臺灣 中衛 興安盟 清遠 雅安 大慶 安陽 長治

巨人網絡通訊聲明:本文標題《幫助你排序文本文件的 Awk 命令行或腳本(推薦)》,本文關鍵詞  幫助,你,排序,文本,文件,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《幫助你排序文本文件的 Awk 命令行或腳本(推薦)》相關的同類信息!
  • 本頁收集關于幫助你排序文本文件的 Awk 命令行或腳本(推薦)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    99国产精品视频免费观看| 久久国产精品无码网站| 亚洲成人tv网| 日本高清无吗v一区| 亚洲精选视频在线| 久久99国内精品| 欧美日韩在线精品一区二区三区激情| 亚洲视频一区二区在线| 色婷婷综合久久久中文一区二区| 亚洲人123区| 欧美日韩黄色一区二区| 美国十次综合导航| 久久美女高清视频| 国产一区在线观看视频| 国产精品日韩精品欧美在线| 成人性视频免费网站| 中文字幕佐山爱一区二区免费| 欧美高清在线视频| av高清不卡在线| 亚洲午夜免费电影| 欧美岛国在线观看| www.日本不卡| 婷婷开心激情综合| 国产亚洲一本大道中文在线| 色综合 综合色| 欧美主播一区二区三区| 欧美中文字幕不卡| 韩国一区二区三区| 亚洲欧美日韩中文字幕一区二区三区 | 亚洲成人精品影院| 日韩精品一区二区三区四区视频| 国产成人鲁色资源国产91色综| 一区二区在线观看视频| 精品日韩一区二区三区免费视频| 成人免费毛片a| 欧美日韩精品久久久| 国产一区二区三区久久久| 一区二区成人在线| 久久无码av三级| 欧美日韩一区二区三区视频| 国产大片一区二区| 五月婷婷综合激情| 中文字幕制服丝袜成人av| 欧美一区二区三区免费大片| 国产91丝袜在线18| 最新国产成人在线观看| 国产日韩欧美综合在线| 欧美日韩一区成人| 99久久精品国产精品久久| 日本美女视频一区二区| 亚洲制服丝袜一区| 国产精品欧美久久久久一区二区| 欧美一区二区二区| 欧美天堂一区二区三区| 91丨porny丨蝌蚪视频| 国产成人在线电影| 精彩视频一区二区三区| 日韩电影免费一区| jlzzjlzz国产精品久久| 国产一区二区三区四| 久久精品国内一区二区三区| 亚洲 欧美综合在线网络| 亚洲你懂的在线视频| 综合久久久久久久| 最新久久zyz资源站| 最好看的中文字幕久久| 综合欧美亚洲日本| 一区二区三区久久| 91官网在线观看| 91亚洲国产成人精品一区二区三| 成人黄色片在线观看| 91片在线免费观看| 在线免费观看日本一区| 日本黄色一区二区| 欧美视频完全免费看| 欧美日韩在线播| 欧美日韩一级二级三级| 91精品国产综合久久精品| 欧美一区二区三区精品| 欧美变态凌虐bdsm| 国产亚洲制服色| 亚洲欧洲美洲综合色网| eeuss鲁一区二区三区| 91免费观看视频在线| 色婷婷久久久亚洲一区二区三区| 日韩免费成人网| 国产三级一区二区| 亚洲视频小说图片| 午夜影院在线观看欧美| 狠狠久久亚洲欧美| 欧美在线观看你懂的| 亚洲福中文字幕伊人影院| 人人精品人人爱| 经典一区二区三区| 成人免费精品视频| 欧美日韩在线精品一区二区三区激情 | 一级中文字幕一区二区| 一区二区视频在线| 欧美a一区二区| 成人黄色av网站在线| 91黄色在线观看| 日韩精品一区二区三区视频| 国产精品黄色在线观看 | 成人午夜电影久久影院| 在线日韩国产精品| 久久一夜天堂av一区二区三区| 国产精品美日韩| 秋霞国产午夜精品免费视频| 99精品国产视频| 日韩免费视频一区二区| 亚洲男同性恋视频| 欧美色综合久久| 国产一区二区三区最好精华液| 在线中文字幕一区二区| 久久嫩草精品久久久精品一| 香蕉乱码成人久久天堂爱免费| 成人中文字幕电影| 欧美不卡在线视频| 日韩经典一区二区| 一本一道久久a久久精品| 久久精品视频一区二区| 亚洲午夜在线视频| 欧美videos中文字幕| 性欧美疯狂xxxxbbbb| 国产a精品视频| 精品日韩在线一区| 天天综合网 天天综合色| 国产精品久久一卡二卡| 激情文学综合丁香| 日韩亚洲欧美中文三级| 亚洲国产综合色| av午夜一区麻豆| 久久精品亚洲乱码伦伦中文| 蜜桃av一区二区在线观看| 欧美日韩大陆在线| 亚洲一区二区高清| 欧美电影免费观看高清完整版在| 欧美日韩午夜精品| 亚洲一区二区三区影院| 91成人免费在线视频| 亚洲精品欧美综合四区| 91美女精品福利| 自拍偷拍国产亚洲| 国产成人在线视频网址| 国产日韩欧美综合一区| 成人app网站| 中文字幕中文字幕一区二区| 99久久国产综合精品色伊| 国产精品福利一区二区三区| 91一区二区三区在线观看| 亚洲综合久久久| 3d动漫精品啪啪| 国内精品伊人久久久久av一坑 | 精东粉嫩av免费一区二区三区| 日韩美女视频在线| 精品一区中文字幕| 国产三级三级三级精品8ⅰ区| 国产91色综合久久免费分享| 亚洲欧洲制服丝袜| 欧美日韩亚洲另类| 久久精品国产99| 国产精品美女久久久久av爽李琼| 国产a精品视频| av成人动漫在线观看| 欧美高清在线一区| 欧美日韩国产综合一区二区三区| 日本在线播放一区二区三区| 久久午夜老司机| 日本精品视频一区二区| 另类专区欧美蜜桃臀第一页| 国产精品麻豆视频| 欧美人牲a欧美精品| 国产高清精品在线| 亚洲成人激情社区| 久久久久久久性| 欧美日韩精品高清| 不卡欧美aaaaa| 蜜桃av噜噜一区二区三区小说| 国产欧美一区二区在线观看| 在线精品视频一区二区| 2021中文字幕一区亚洲| 99精品国产99久久久久久白柏| 亚洲sss视频在线视频| 久久久久久久久久看片| 欧美无人高清视频在线观看| 国产风韵犹存在线视精品| 亚洲va韩国va欧美va精品| 国产丝袜欧美中文另类| 777久久久精品| 一本一道综合狠狠老| 经典三级在线一区| 极品美女销魂一区二区三区免费| 欧美性色黄大片| 成人av在线资源网| 久久er精品视频| 天天免费综合色| 亚洲精品国久久99热| 国产精品欧美一级免费| 久久久久国产一区二区三区四区 | 精品国内片67194|