亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 46192 | 回復(fù): 14
打印 上一主題 下一主題

[學(xué)習(xí)共享] awk的數(shù)組之升級版 [復(fù)制鏈接]

論壇徽章:
2
射手座
日期:2014-10-10 15:59:4715-16賽季CBA聯(lián)賽之上海
日期:2016-03-03 10:27:14
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2016-07-25 16:51 |只看該作者 |倒序瀏覽
本帖最后由 yinyuemi 于 2016-07-26 10:23 編輯

好久沒發(fā)帖了,今天來策一策awk的數(shù)組升級版,參考自https://www.gnu.org/software/gawk/manual/gawk.html#Arrays
awk數(shù)組的基本用法,這里就不再贅述了(3.0+版本數(shù)組的主要用法在這里http://www.72891.cn/thread-2312439-1-1.html),這里主要講是gawk4.0+版本中關(guān)于數(shù)組的2種新用法,所以還沒有升級版本的筒子們趕快動起來吧。

1. 預(yù)定義遍歷的數(shù)組

一般情況下,用for item in array的方法輸出數(shù)組的值,其順序是沒有定義的,也就是”亂序的“。但是很多時候,我們希望
數(shù)組的值按照一定的要求輸出,比如按照數(shù)值大小升序或降序的方式等等。此時,一般的做法,是通過asort或asorti來間接實現(xiàn)。
不過,現(xiàn)在好了,gawk4.0+版本提供了非常方便的對數(shù)組輸出的控制模式。
這里涉及到一個gawk的一個內(nèi)置數(shù)組PROCINFO,大家可以運行這個查看它的詳細信息:
  1. awk 'BEGIN{for(i in PROCINFO){if(isarray(PROCINFO[i])){for( j in PROCINFO[i])print i,j,PROCINFO[i][j]}else{print i,PROCINFO[i]}}}'
復(fù)制代碼
其中控制數(shù)組遍歷模式的是"sorted_in",如下面的列表:

ROCINFO ["sorted_in"]        Description
@unsorted        Array indexes are processed in arbitrary order (default awk behavior).
@ind_str_asc        The array is sorted with indexes compared as strings in ascending order.
@ind_num_asc        The array is sorted with indexes compared as numbers in ascending order. Non-numeric indexes are treated as zero.
@val_type_asc        The array is sorted based on values as per its type in ascending order. All numbers come before the strings. The sub-arrays come after the strings.
@val_str_asc        The array is sorted based on values of elements, treating the values as strings, in ascending order.
@val_num_asc        The array is sorted based on values of elements, treating values as numbers, in ascending order.
@ind_str_desc        The array is sorted based on index, treated as strings, in descending order.
@ind_num_desc        The array is sorted based on index, treated as numbers, in descending order.
@val_type_desc        The array is sorted based on the value of the element as per its type in descending order. Subarrays come first, then the strings and lastly, the numbers.
@val_str_desc        The array is sorted based on element values, treated as strings, in descending order.
@val_num_desc        The array is sorted based on values, treated as numbers, in descending order.

一言不合舉栗子:
  1. # 默認方式,即無序

  2. awk '
  3. BEGIN {PROCINFO ["sorted_in"] = "@unsorted"

  4.     fruit ["apple"] = 4
  5.     fruit ["mango"] = 12
  6.     fruit ["guava"] = 8
  7.     fruit ["banana"] = 16

  8.     for (j in fruit)
  9.         printf ("%s: %d numbers\n", j, fruit [j])
  10. } '

  11. guava: 8 numbers
  12. mango: 12 numbers
  13. apple: 4 numbers
  14. banana: 16 numbers

復(fù)制代碼
  1. # 按照value的大小升序

  2. awk '
  3. BEGIN {PROCINFO ["sorted_in"] = "@val_num_asc"

  4.     fruit ["apple"] = 4
  5.     fruit ["mango"] = 12
  6.     fruit ["guava"] = 8
  7.     fruit ["banana"] = 16

  8.     for (j in fruit)
  9.         printf ("%s: %d numbers\n", j, fruit [j])
  10. } '

  11. apple: 4 numbers
  12. guava: 8 numbers
  13. mango: 12 numbers
  14. banana: 16 numbers

復(fù)制代碼
  1. # 按照index字母順序降序

  2. awk '
  3. BEGIN {PROCINFO ["sorted_in"] = "@ind_str_desc"

  4.     fruit ["apple"] = 4
  5.     fruit ["mango"] = 12
  6.     fruit ["guava"] = 8
  7.     fruit ["banana"] = 16

  8.     for (j in fruit)
  9.         printf ("%s: %d numbers\n", j, fruit [j])
  10. } '


  11. mango: 12 numbers
  12. guava: 8 numbers
  13. banana: 16 numbers
  14. apple: 4 numbers

復(fù)制代碼
俗話說,”栗子不過三“,就舉到這里先。
是不是覺得asort/asorti在這個sorted_in”控制閥“面前弱爆了?!
友情提示: 因為PROCINFO ["sorted_in"]是全局性的變量,一旦設(shè)定之后,會改變整個awk的數(shù)組遍歷方式,所以如果你希望在小范圍內(nèi)使用,可以按照下面的方式來做。


  1. if ("sorted_in" in PROCINFO) {
  2.     save_sorted = PROCINFO["sorted_in"]
  3.     PROCINFO["sorted_in"] = "@val_str_desc" # or whatever
  4. }

  5. if (save_sorted)
  6.     PROCINFO["sorted_in"] = save_sorted

復(fù)制代碼
事實上,除了awk內(nèi)置的遍歷函數(shù),sorted_in也可以被賦予自定義的函數(shù)。
自定義的函數(shù)有個通用的代碼框架如下:

  1. function comp_func(i1, v1, i2, v2) # 至少包含4個參數(shù)
  2. {
  3.     compare elements 1 and 2 in some fashion
  4.     return < 0; 0; or > 0
  5. }
復(fù)制代碼
栗子如下:

  1. awk '

  2. BEGIN{
  3.     arr[1] = 10
  4.     arr[2] = 2
  5.     arr[3] = 100
  6.         arr["one"] = 10
  7.         arr["two"] = 1
  8.         arr["three"] = 100
  9.     PROCINFO["sorted_in"] = "cmp_num_val_desc"
  10.     print "#exactly the same as @val_num_desc"
  11.     for(i in  arr)
  12.         print "arr["i"] = " arr[i]

  13.     print "如果排序規(guī)則改為:1. index:字母在前,數(shù)字之后    2. index一致時, value降序"
  14.     PROCINFO["sorted_in"] = "cmp_smart_desc"
  15.     print "#sort in a smarter way"
  16.         for(i in  arr)
  17.         print "arr["i"] = " arr[i]
  18. }
  19. function cmp_num_val_desc(i1, v1, i2, v2)
  20. {
  21.     # numerical value comparison, descending order,
  22.     return (v2 - v1)
  23. }


  24. function cmp_smart_desc(i1, v1, i2, v2,   n1, n2)
  25. {
  26.      # numbers after string value comparison, descending order
  27.      n1 = i1 + 0
  28.      n2 = i2 + 0
  29.      if (n1 != i1)
  30.          return (n2 != i2) ? (v2 - v1) : -1
  31.      else if (n2 != i2)
  32.          return 1
  33.      return v2 - v1
  34. }
  35. '


  36. #exactly the same as @val_num_desc
  37. arr[three] = 100
  38. arr[3] = 100
  39. arr[one] = 10
  40. arr[1] = 10
  41. arr[2] = 2
  42. arr[two] = 1
  43. 如果排序規(guī)則改為:1. index:字母在前,數(shù)字之后    2. index一致時, value降序
  44. #sort in a smarter way
  45. arr[three] = 100
  46. arr[one] = 10
  47. arr[two] = 1
  48. arr[3] = 100
  49. arr[1] = 10
  50. arr[2] = 2

復(fù)制代碼
2. 數(shù)組的數(shù)組 (Arrays of Arrays)

有了它,awk就可以真正創(chuàng)建多維數(shù)組,而不像以前版本那樣用一維數(shù)組來模擬多維。
如果有童鞋對perl的hash熟悉的話,那么它可以理解為hash of hash。

下面先看“數(shù)組的數(shù)組”活生生的樣子吧

  1. a[1][1]=1
  2. a[1][2]=2
  3. a[1][3]=3
復(fù)制代碼
是不是很眼熟,在某種/些語言里有相同的寫法。
沒錯,這就是一個典型的二維數(shù)組,第一維的index為[1],第二維為[1][2][3]。
事實上,為了保持每一維度在index使用的靈活性,對于下面的寫法也是繼續(xù)支持的:

  1. a[1][1,"a"]=1
  2. a[1][2,"a"]=2
  3. a[1][3,"a"]=3
復(fù)制代碼
并且,每一維數(shù)組的value可以是一個scalar,也可以是一個subarray

  1. a[1][1,"a"]=1
  2. a[2]=2
  3. a[3][3][4]=3
復(fù)制代碼
好了,說了這么多,如何打印Arrays of Arrays呢?其實很簡單~

  1. for (i in array)
  2.     for (j in array[i])
  3.         print array[i][j]
復(fù)制代碼
當你不知道某個維度的value是scalar,還是subarray,那么可以加個判斷。
如何判斷呢?也很簡單,因為新版gawk已經(jīng)幫你寫好函數(shù),就等你用了,它就是isarray。
官方文檔還配備了一個殘暴的walk_array, 簡直是無所不至。

  1. function walk_array(arr, name,      i)
  2. {
  3.     for (i in arr) {
  4.         if (isarray(arr[i]))
  5.             walk_array(arr[i], (name "[" i "]"))
  6.         else
  7.             printf("%s[%s] = %s\n", name, i, arr[i])
  8.     }
  9. }
復(fù)制代碼
好久沒有寫文檔了,一口氣寫了這么多,感覺身體快被掏空 不多說了,再打一套以上兩個新功能的“組合拳”就結(jié)貼了!
模擬sort排序

  1. cat file
  2. abc 123 100
  3. abc 456 100
  4. abc 456 10
  5. def 123 10
  6. def 123 100
  7. abc 123 1
  8. xzy 789 0


  9. # sort 排序: 第一列按照字母升序,第二列數(shù)字升序,第三列數(shù)字降序

  10. sort -k1,1 -k2,2n -k3,3nr file
  11. abc 123 100
  12. abc 123 1
  13. abc 456 100
  14. abc 456 10
  15. def 123 100
  16. def 123 10
  17. xzy 789 0


  18. # awk 3.0+ 排序

  19. awk '
  20. {
  21.     a[$1" "$2" "$3];
  22.         b[$1]=$1;
  23.         c[$2];
  24.         d[$3]
  25. }
  26. END{
  27.         for(i=1;i<=asort(b);i++)
  28.                 for(j=1;j<=asorti(c,e);j++)
  29.                         for(k=asorti(d,f);k>=1;k--)
  30.                                 if(b[i]" "e[j]" "f[k] in a)
  31.                                         print b[i],e[j],f[k]
  32. }
  33. ' file
  34. abc 123 100
  35. abc 123 1
  36. abc 456 100
  37. abc 456 10
  38. def 123 100
  39. def 123 10
  40. xzy 789 0



  41. # gawk 4.0+ 排序

  42. awk '
  43. {
  44.     arr[$1][$2][$3]
  45. }
  46. END{
  47.     PROCINFO["sorted_in"] = "@ind_str_asc"
  48.     for(i in arr){
  49.         PROCINFO["sorted_in"] = "@ind_num_asc"
  50.         for(j in arr[i]){
  51.             PROCINFO["sorted_in"] = "@ind_num_desc"
  52.             for(k in arr[i][j])
  53.                 print i,j,k
  54.         }
  55.     }
  56. }
  57. ' file

  58. abc 123 100
  59. abc 123 1
  60. abc 456 100
  61. abc 456 10
  62. def 123 100
  63. def 123 10
  64. xzy 789 0


復(fù)制代碼
兩種awk的寫法相比,gawk的是不是更加清晰,明了呢


艾瑪呀,終于寫完了,希望能給大家一些啟示和幫助,拋磚引玉,如有錯誤的地方,請不吝指正!

最后還想說的是gawk4.0版本還有很多fancy的功能,有興趣的可以翻翻 http://www.72891.cn/thread-3559813-1-1.html



評分

參與人數(shù) 10可用積分 +5 信譽積分 +90 收起 理由
關(guān)陰月飛 + 10 牛,學(xué)習(xí)了,求工作!
zsszss0000 + 10 贊一個!
expert1 + 5 很給力!
liion631818 + 10 大神出馬,一個頂百
WilliBhamlll + 10 很給力!
jcdiy0601 + 10 贊一個!
blackold + 10 贊一個!
songyc_2015 + 10 向s博學(xué)習(xí)
reyleon + 10 S博的文章必須贊啊
Herowinter + 10 向大神學(xué)習(xí)!

查看全部評分

論壇徽章:
5
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亞洲杯之朝鮮
日期:2015-03-13 22:47:33IT運維版塊每日發(fā)帖之星
日期:2016-01-09 06:20:00IT運維版塊每周發(fā)帖之星
日期:2016-03-07 16:27:44
2 [報告]
發(fā)表于 2016-07-25 17:10 |只看該作者
@yinyuemi 贊。! 學(xué)習(xí)了。

論壇徽章:
2
射手座
日期:2014-10-10 15:59:4715-16賽季CBA聯(lián)賽之上海
日期:2016-03-03 10:27:14
3 [報告]
發(fā)表于 2016-07-25 17:42 |只看該作者
回復(fù) 2# blackold


    黑哥,謙虛啦,多指正補充。

論壇徽章:
20
卯兔
日期:2015-01-26 22:05:142015亞冠之薩濟拖拉機
日期:2015-09-10 15:15:282015亞冠之阿爾希拉爾
日期:2015-09-25 17:37:53程序設(shè)計版塊每日發(fā)帖之星
日期:2015-10-03 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-09 06:20:00CU十四周年紀念徽章
日期:2015-12-17 09:07:15程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-25 06:20:34程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-25 06:20:34程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-25 06:20:342015亞冠之廣州富力
日期:2015-08-27 19:29:56每日論壇發(fā)貼之星
日期:2015-08-26 06:20:002015亞冠之阿爾希拉爾
日期:2015-05-18 17:26:27
4 [報告]
發(fā)表于 2016-07-25 18:16 |只看該作者
先點贊后學(xué)習(xí)

論壇徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16賽季CBA聯(lián)賽之北京
日期:2016-07-06 15:42:0715-16賽季CBA聯(lián)賽之同曦
日期:2016-06-12 10:38:0915-16賽季CBA聯(lián)賽之佛山
日期:2016-05-27 11:54:56黃金圣斗士
日期:2015-12-02 11:44:35白銀圣斗士
日期:2015-11-25 14:32:43白銀圣斗士
日期:2015-11-23 12:53:352015亞冠之布里斯班獅吼
日期:2015-10-21 16:55:482015亞冠之首爾
日期:2015-09-01 16:46:052015亞冠之德黑蘭石油
日期:2015-08-31 11:39:192015亞冠之薩濟拖拉機
日期:2015-08-28 21:06:5315-16賽季CBA聯(lián)賽之廣東
日期:2016-07-12 14:58:53
5 [報告]
發(fā)表于 2016-07-25 18:24 |只看該作者
明日再細閱, 今天的醬油打完了, go home ...

論壇徽章:
0
6 [報告]
發(fā)表于 2016-07-25 22:49 |只看該作者
先回復(fù)了再學(xué)習(xí),謝謝lz

論壇徽章:
6
羊年新春福章
日期:2015-03-03 17:16:28雙子座
日期:2015-03-03 17:16:56巳蛇
日期:2015-03-03 17:17:2415-16賽季CBA聯(lián)賽之福建
日期:2016-03-11 09:05:00黑曼巴
日期:2016-07-07 16:58:1215-16賽季CBA聯(lián)賽之吉林
日期:2016-11-14 09:23:07
7 [報告]
發(fā)表于 2016-07-26 09:50 |只看該作者
向大師學(xué)習(xí),給分收藏,慢慢消化

論壇徽章:
2
子鼠
日期:2014-12-09 14:03:562015年亞洲杯之巴勒斯坦
日期:2015-03-31 10:49:39
8 [報告]
發(fā)表于 2016-07-26 10:52 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽

論壇徽章:
16
IT運維版塊每日發(fā)帖之星
日期:2015-08-24 06:20:00綜合交流區(qū)版塊每日發(fā)帖之星
日期:2015-10-14 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-10-25 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-11-06 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT運維版塊每日發(fā)帖之星
日期:2016-04-15 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-21 06:20:00綜合交流區(qū)版塊每日發(fā)帖之星
日期:2016-08-16 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:17IT運維版塊每日發(fā)帖之星
日期:2015-08-14 06:20:00
9 [報告]
發(fā)表于 2016-07-26 12:39 |只看該作者
學(xué)習(xí),ss大師總是走在時代前沿啊,4.0都用了。

求職 : 機器學(xué)習(xí)
論壇徽章:
79
2015年亞洲杯紀念徽章
日期:2015-05-06 19:18:572015七夕節(jié)徽章
日期:2015-08-21 11:06:172015亞冠之阿爾納斯爾
日期:2015-09-07 09:30:232015亞冠之薩濟拖拉機
日期:2015-10-21 08:26:3915-16賽季CBA聯(lián)賽之浙江
日期:2015-12-30 09:59:1815-16賽季CBA聯(lián)賽之浙江
日期:2016-01-10 12:35:21技術(shù)圖書徽章
日期:2016-01-15 11:07:2015-16賽季CBA聯(lián)賽之新疆
日期:2016-02-24 13:46:0215-16賽季CBA聯(lián)賽之吉林
日期:2016-06-26 01:07:172015-2016NBA季后賽紀念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16賽季CBA聯(lián)賽之浙江
日期:2017-07-18 13:41:54
10 [報告]
發(fā)表于 2016-07-26 14:21 |只看該作者
頂一下。。。。。。。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP