1. 程式人生 > >awk使用筆記:多維陣列(帶例子)

awk使用筆記:多維陣列(帶例子)

awk通過將下標整體看成一個字串來支援多維陣列。本文結合例子介紹awk多維陣列的賦值及遍歷。

1. 多維陣列

awk通過將下標整體看成一個字串來支援多維陣列,實際上是一維陣列,如array[5,6]=7,下標5和6連結成字串5SUBSEP6(數字5和6被視為字串),SUBSEP是awk內建的一個變數,預設值是\034(檔案分隔符file separator),可見,awk可以支援任意維的陣列。

2. 陣列賦值

awk變數無須定義,可直接賦值,舉例如下:

  1. # name ID score
  2. array["Jelline","201021060111"]=100
  3. array["SparkandShine"
    ,"201021060118"]=150

3. 遍歷陣列

由上面分析可知,awk多維陣列本質上是一維陣列,比較特殊的是多個下標用特殊字元SUBSEP連結成一個字串,用split可以將下標分隔開。遍歷多維陣列原始碼如下:

  1. # 列印陣列
  2. for(subscript in array){
  3. split(subscript, a, SUBSEP);
  4. printf "%s\t%s\t%s\n", a[1], a[2], array[a[1], a[2]]
  5. }
  6. # 輸出結果如下:
  7. SparkandShine201021060118150
  8. Jelline201021060111100
  9. # 對於數值,還可以這樣遍歷
  10. for(i=0; i<
    M; i++){
  11. for(j=0; j<N; j++){
  12. print array[i, j]
  13. }
  14. }

3.1 分割字串split

函式split用法如下:

  1. split(string, array [, fieldsep [, seps ]])

將string按fieldsep分割儲存在array[1], array[2], ..., 並將分隔符依次儲存在seps[1], sep[2], ..., 最後返回被分割的數目。舉例如下:

  1. split("cul-de-sac", a,"-", seps)
  2. a[1]="cul"
  3. a[2]="de"
  4. a[3]="sac"
  5. seps[1]="-"
  6. seps[2]=
    "-"
  7. 函式返回值為3

4. 其他

可以通過以下方法判斷一個數組是否存在指定的下標,用於if語句,如下:

  1. (subscript1, subscript2,…)in array