[sh]awk用法

grep匹配第一個則停止

grep -m
 -m num, --max-count=num
             Stop reading the file after num matches.

shell中的數組

  • 定義
nums=(29 100 13 8 91 44)

# 弱類型的
arr=(20 56 "http://c.biancheng.net/shell/")
  • 添加元素

awk將二維錶轉換爲kv格式

awk '
{
  if(NR == 1) {
    for (i=2; i <= NF;i++) type[i]=$i
  }else {
    for (j=2;j <= NF; j++) arr[$1,type[j]]=$j
  }
}
END {
    for (k in arr) {
        split(k, idx, SUBSEP);
        gsub(/\.|-/,"_",idx[1])
        gsub(/\/|\(|\)/,"_",idx[2])
        gsub(/False/,"0",arr[k])
        gsub(/True/,"1",arr[k])
        print "GamesvrOnline""{usage=\""idx[2]"\",GameSvr=\""idx[1]"\"} "arr[k]
    }
}' 
nums[6]=88

ages=([3]=24 [5]=19 [10]=12) # 只支持整型下標
  • 獲取元素
n=${nums[2]}

# 獲取所有元素
${nums[*]}
${nums[@]}
  • 實例
nums=(29 100 13 8 91 44)
echo ${nums[@]}  #輸出所有數組元素
nums[10]=66  #給第10個元素賦值(此時會增加數組長度)
echo ${nums[*]}  #輸出所有數組元素
echo ${nums[4]}  #輸出第4個元素

29 100 13 8 91 44
29 100 13 8 91 44 66
91

awk的for循環

學習awk的內置變量,及默認值
學習awk的內置函數

awk中數組和shell中數組用法不一樣. 它支持字符串下標

awk一維數組

a) 數字下標

array[1]="it"
array[2]="homer"
array[3]="sunboy"
array[4]=2050



b) 字符下標

array["first"]="yang"
array["second"]="gang"
array["third"]="sunboy"
  • 獲取
#!/bin/bash
 
awk 'BEGIN{
array[1]="it"
array[2]="homer"
array[3]="sunboy"
array[4]=2050
 
 
array["first"]="yang"
array["second"]="gang"
array["third"]="sunboy"
 
 
print array[1], array[4]
print array[3], array["third"]}'
  • 遍歷
#!/bin/bash
 
awk 'BEGIN{
   for(i=1; i<=5; i++){
       array[i] = i*2 - 1;
   }
   for(i in array){
       print i" = " array[i];#i是下標, array[i]是對應的值
   }
}'

awk二維數組

awk 多維數組在本質上是一維數組,因awk在存儲上並不支持多維數組,
awk提供了邏輯上模擬二維數組的訪問方式。例如,array[2,3] = 1這樣的訪問是允許的。

awk使用一個特殊的字符串SUBSEP (\034)作爲分割字段,
在上面的例子 array[2,3] = 1 中,關聯數組array存儲的鍵值實際上是2\0343,
2和3分別爲下標(2,3),\034爲SUBSEP分隔符

類似一維數組的成員測試,多維數組可以使用 if ( (i,j) in array) 語法,但是下標必須放置在圓括號中。
類似一維數組的循環訪問,多維數組使用 for ( item in array ) 語法遍歷數組。與一維數組不同的是,多維數組必須使用split()函數來訪問單獨的下標分量,格式: split ( item, subscr, SUBSEP), 例如: split (item, array2, SUBSEP); 後,array2[1]爲下標“2”, array2[2]爲下標“3”

示例:

#!/bin/bash
 
awk 'BEGIN{
   for(i=1; i<=3; i++){
       for(j=1; j<=3; j++){
           array[i, j] = i * j;
           print i" * "j" = "array[i,j];
       }
   }
   print
   for(i in array){
       split(i, array2, SUBSEP);
       print array2[1]" * "array2[2]" = " array[i]; # array2[1]爲下標第一項, array2[1]爲下標第二項, 
   }
}'
  • 內置函數

[gsub(//|(|)/,"_",idx[2]) # 返回替換的次數.(https://blog.csdn.net/zhuying_linux/article/details/7104938)

length

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章