shell數組和awk數組

awk終於能入門了,因此整理了該文章,內容大多來自網上。
html


1、bash支持一維數組(不支持多維數組),沒有限定數組的大小。在shell中,用括號來表示數組,數組元素用空格符號分割開。相似於C語言,數組元素的下標由0開始編號。獲取數組中的元素要利用下標,下標能夠是整數或算術表達式,其值應大於或等於0shell


1. 定義數組
數組名array,元素a b c
[root@localhost~]# array=(a b c)

2.獲取全部元素
[root@localhost~]# echo ${array[*]}
a b c
[root@localhost~]# echo ${array[@]}
a b c

3.獲取數組的長度
[root@localhost~]# echo ${#array[*]}
3

4.經過下標0 1 2依次獲取數組的每個元素
[root@localhost~]# echo ${array[0]}
a
[root@localhost~]# echo ${array[1]}
b
[root@localhost~]# echo ${array[2]}
c

5.獲取部分數組
[root@localhost~]# echo ${array[*]:0:2}
a b

6.刪除第一個元素
[root@localhost~]# unset array[0]

7.刪除整個數組
[root@localhost~]# unset array


小例子:express

#!/bin/bash
#刪除指定目錄下的文件

a=(/usr/local/tomcat/logs /home/user/tomcat/logs /usr/local/app/tomcat/logs)

for i in "${a[@]}"
do 
    find "$i" -maxdepth 1 -type f -name "*.txt"  ! -name "*.*" ! -mtime +30 -exec rm {} \;
done


2、awk數組數組

awk的數組,一種關聯數組(Associative Arrays),支持多維數組,下標能夠是數字和字符串。因無需對數組名和元素提早聲明,也無需指定元素個數 ,因此awk的數組使用很是靈活。tomcat


1.創建數組bash

array[index]=value 數組名array,下標index以及相應的值value


2.讀取數組值app

{for (item in array)  print array[item]} # 輸出的順序是隨機的
{for(i=1;i<=len;i++)  print array[i]}    # len 是數組的長度


3.多維數組,array[index1,index2,……]:SUBSEP是數組下標分割符。能夠事先設定SUBSEP,也能夠直接在SUBSEP的位置輸入你要用的分隔符,如:ide

[root@localhost~]# awk 'BEGIN{array["a","b"]=1;for(i in array) print i}'
a b
[root@localhost~]# awk 'BEGIN{SUBSEP=":";array["a","b"]=1;for(i in array) print i}'
a:b
[root@localhost~]# awk 'BEGIN{array["a"":""b"]=1;for(i in array) print i}'
a:b
[root@localhost~]# cat file 
A 192.168.1.1 HTTP 
B 192.168.1.2 HTTP 
B 192.168.1.2 MYSQL 
C 192.168.1.1 MYSQL 
C 192.168.1.1 MQ 
D 192.168.1.4 NGINX
[root@localhost~]# awk '{a[$1"-"$2]++}END{for(i in a)print a[i],i}' file
[root@localhost~]# awk '{SUBSEP="-"}{a[$1,$2]++}END{for(i in a) print a[i],i}' file
2 B-192.168.1.2
1 D-192.168.1.4
2 C-192.168.1.1
1 A-192.168.1.1

[root@localhost~]# awk '{$1="";a[$2]=a[$2]FS$3}END{for(i in a)print i,a[i]}' file
192.168.1.4  NGINX
192.168.1.1  HTTP MYSQL MQ
192.168.1.2  HTTP MYSQL
[root@localhost~]# awk '{$1="";a[$2]=a[$2]";"$3}END{for(i in a)print i a[i]}' file
192.168.1.4;NGINX
192.168.1.1;HTTP;MYSQL;MQ
192.168.1.2;HTTP;MYSQL


4.刪除數組或數組元素,使用delete函數函數

delete array                 #刪除整個數組
delete array[item]           #刪除某個數組元素(item)


5.排序:awk中的asort函數能夠實現對數組的值進行排序,不過排序以後的數組下標改成從1到數組的長度。在gawk 3.1.2之後的版本還提供了一個asorti函數,這個函數不是依據關聯數組的值,而是依據關聯數組的下標排序,即asorti(array)之後,仍會用數字(1到數組長度)來做爲下標,可是array的數組值變爲排序後的原來的下標,除非你指定另外一個參數如:asorti(a,b)。.net

[root@localhost~]# echo 'aa
bb
aa
bb
cc' |\
awk '{a[$0]++}END{l=asorti(a);for(i=1;i<=l;i++)print a[i]}'
aa
bb
cc
 
[root@localhost~]# echo 'aa
bb
aa
bb
cc' |\
awk '{a[$0]++}END{l=asorti(a,b);for(i=1;i<=l;i++)print b[i],a[b[i]]}'
aa 2
bb 2
cc 1


[root@localhost~]# echo "a
1
0
b
2
10
8
100" |
awk '{a[$0]=$0} #創建數組a,下標爲$0,賦值也爲$0
END{
len=asort(a)      #利用asort函數對數組a的值排序,同時得到數組長度len
for(i=1;i<=len;i++) print i "\t"a[i]  #打印
}'
1       0
2       1
3       2
4       8
5       10
6       100
7       a
8       b


6.去重

[root@localhost~]# cat file 
1
2
1
3
4
5
6
[root@localhost~]# awk 'a[$1]++' file
1
[root@localhost~]# awk '!a[$1]++' file
1
2
3
4
5
6


7.求和

[root@localhost~]# cat file
s1 4
s1 64
s2 1
[root@localhost~]# awk '$1~/s1/{a+=$2}END{print a}' file
68


[root@localhost~]# cat file
aaa 1
aaa 1
ccc 1
aaa 1
bbb 1
[root@localhost~]# awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}' file
aaa 3
bbb 1
ccc 1


8.經過split函數創建數組:數組的下標爲從1開始的數字

split(s, a [, r]) # s:string, a:array name,[,r]:regular expression。
[root@localhost~]# echo 'abcd' |awk '{len=split($0,a,"");for(i=1;i<=len;i++) print "a["i"] = " a[i];print "length = " len}'
a[1] = a
a[2] = b
a[3] = c
a[4] = d
length = 4

 

求1月份相同名字和總和

[root@localhost~]# cat file 
Tom     2012-12-11      car     5       3000
John    2013-01-13      bike    4       1000
vivi    2013-01-18      car     4       2800
Tom     2013-01-20      car     3       2500
John    2013-01-28      bike    6       3500
[root@localhost~]# awk '{split($2,a,"-");if(a[2]==01){b[$1]+=$5}}END{for(i in b)print i,b[i]}' file 
vivi 2800
Tom 2500
John 4500


9.求平均數

[root@localhost~]# cat file 
/circlelistbytjid,耗時:25ms
/circlelistbytjid,耗時:24ms
/circlelistbytjid,耗時:21ms
/circlelistbytjid,耗時:13ms
/circlelistbytjid,耗時:25ms
/circlelistbytjid,耗時:13ms
/circlelistbytjid,耗時:23ms
/circlelistbytjid,耗時:24ms
[root@localhost~]# awk -F: '{a+=+$2}END{print a/NR}' file
21


[root@localhost~]# cat file
alex 20
tom 30
alex 10
tom 20
[root@localhost~]# awk '{a[$1]+=$2;b[$1]++}END{for(i in a) print i,a[i]/b[i]}' file
alex 15
tom 25


10.求最大值

獲取數字字段最大值

[root@localhost~]# cat file 
a b 1 
c d 2 
e f 3 
g h 3 
i j 2
[root@localhost~]# awk 'BEGIN{max=0}{if($3>max)max=$3}END{print max}' file
3


打印第三字段最大行

[root@localhost~]# awk 'BEGIN{max=0}{a[$0]=$3;if($3>max)max=$3}END{for(v in a)if(a[v]==max)print v}' file
e f 3 
g h 3


11.合併file1和file2,除去重複項

[root@localhost~]#cat file1
aaa
bbb
ccc
ddd
[root@localhost~]#cat file2
aaa
eee
ddd
fff


[root@localhost~]# awk 'NR==FNR{a[$0]=1;print}   #讀取file1,創建數組a,下標爲$0,並賦值爲1,而後打印
NR>FNR{                   #讀取file2
if(!(a[$0])) {print }      #若是file2 的$0不存在於數組a中,即不存在於file1,則打印。
}' file1 file2
aaa
bbb
ccc
ddd
eee
fff


提取文件1中有,但文件2中沒有:

[root@localhost~]# awk 'NR==FNR{a[$0]=1}           #讀取file2,創建數組a,下標爲$0,並賦值爲1
NR>FNR{                   #讀取file1
if(!(a[$0])) {print }      #若是file1 的$0不存在於數組a中,即不存在於file2,則打印。
}' file2 file1
bbb
ccc


參考文章:http://bbs.chinaunix.net/thread-2312439-1-2.html

相關文章
相關標籤/搜索