awk终于能入门了,所以整理了该文章,内容大多来自网上。
一、bash支持一维数组(不支持多维数组),没有限定数组的大小。在shell中,用括号来表示数组,数组元素用空格符号分割开。类似于C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0
1.定义数组
数组名array,元素abc
[root@localhost~]#array=(abc)
2.获取所有元素
[root@localhost~]#echo${array[*]}
abc
[root@localhost~]#echo${array[@]}
abc
3.获取数组的长度
[root@localhost~]#echo${#array[*]}
3
4.通过下标012依次获取数组的每一个元素
[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}
ab
6.删除第一个元素
[root@localhost~]#unsetarray[0]
7.删除整个数组
[root@localhost~]#unsetarray
小例子:#!/bin/bash
#删除指定目录下的文件
a=(/usr/local/tomcat/logs/home/user/tomcat/logs/usr/local/app/tomcat/logs)
foriin"${a[@]}"
do
find"$i"-maxdepth1-typef-name"*.txt"!-name"*.*"!-mtime+30-execrm{}\;
done
二、awk数组
awk的数组,一种关联数组(Associative Arrays),支持多维数组,下标可以是数字和字符串。因无需对数组名和元素提前声明,也无需指定元素个数 ,所以awk的数组使用非常灵活。
1.建立数组array[index]=value数组名array,下标index以及相应的值value
2.读取数组值{for(iteminarray)printarray[item]}#输出的顺序是随机的
{for(i=1;i<=len;i++)printarray[i]}#len是数组的长度
3.多维数组,array[index1,index2,……]:SUBSEP是数组下标分割符。可以事先设定SUBSEP,也可以直接在SUBSEP的位置输入你要用的分隔符,如:[root@localhost~]#awk'BEGIN{array["a","b"]=1;for(iinarray)printi}'
ab
[root@localhost~]#awk'BEGIN{SUBSEP=":";array["a","b"]=1;for(iinarray)printi}'
a:b
[root@localhost~]#awk'BEGIN{array["a"":""b"]=1;for(iinarray)printi}'
a:b[root@localhost~]#catfile
A192.168.1.1HTTP
B192.168.1.2HTTP
B192.168.1.2MYSQL
C192.168.1.1MYSQL
C192.168.1.1MQ
D192.168.1.4NGINX
[root@localhost~]#awk'{a[$1"-"$2]++}END{for(iina)printa[i],i}'file
[root@localhost~]#awk'{SUBSEP="-"}{a[$1,$2]++}END{for(iina)printa[i],i}'file
2B-192.168.1.2
1D-192.168.1.4
2C-192.168.1.1
1A-192.168.1.1
[root@localhost~]#awk'{$1="";a[$2]=a[$2]FS$3}END{for(iina)printi,a[i]}'file
192.168.1.4NGINX
192.168.1.1HTTPMYSQLMQ
192.168.1.2HTTPMYSQL
[root@localhost~]#awk'{$1="";a[$2]=a[$2]";"$3}END{for(iina)printia[i]}'file
192.168.1.4;NGINX
192.168.1.1;HTTP;MYSQL;MQ
192.168.1.2;HTTP;MYSQL
4.删除数组或数组元素,使用delete函数deletearray#删除整个数组
deletearray[item]#删除某个数组元素(item)
5.排序:awk中的asort函数可以实现对数组的值进行排序,不过排序之后的数组下标改为从1到数组的长度。在gawk 3.1.2以后的版本还提供了一个asorti函数,这个函数不是依据关联数组的值,而是依据关联数组的下标排序,即asorti(array)以后,仍会用数字(1到数组长度)来作为下标,但是array的数组值变为排序后的原来的下标,除非你指定另一个参数如:asorti(a,b)。[root@localhost~]#echo'aa
bb
aa
bb
cc'|\
awk'{a[$0]++}END{l=asorti(a);for(i=1;i<=l;i++)printa[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++)printb[i],a[b[i]]}'
aa2
bb2
cc1
[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++)printi"\t"a[i]#打印
}'
10
21
32
48
510
6100
7a
8b
6.去重[root@localhost~]#catfile
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~]#catfile
s14
s164
s21
[root@localhost~]#awk'$1~/s1/{a+=$2}END{printa}'file
68
[root@localhost~]#catfile
aaa1
aaa1
ccc1
aaa1
bbb1
[root@localhost~]#awk'{a[$1]+=$2}END{for(iina)printi,a[i]}'file
aaa3
bbb1
ccc1
8.通过split函数建立数组:数组的下标为从1开始的数字split(s,a[,r])#s:string,a:arrayname,[,r]:regularexpression。[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~]#catfile
Tom-12-11car53000
John-01-13bike41000
vivi-01-18car42800
Tom-01-20car32500
John-01-28bike63500
[root@localhost~]#awk'{split($2,a,"-");if(a[2]==01){b[$1]+=$5}}END{for(iinb)printi,b[i]}'file
vivi2800
Tom2500
John4500
9.求平均数[root@localhost~]#catfile
/circlelistbytjid,耗时:25ms
/circlelistbytjid,耗时:24ms
/circlelistbytjid,耗时:21ms
/circlelistbytjid,耗时:13ms
/circlelistbytjid,耗时:25ms
/circlelistbytjid,耗时:13ms
/circlelistbytjid,耗时:23ms
/circlelistbytjid,耗时:24ms
[root@localhost~]#awk-F:'{a+=+$2}END{printa/NR}'file
21
[root@localhost~]#catfile
alex20
tom30
alex10
tom20
[root@localhost~]#awk'{a[$1]+=$2;b[$1]++}END{for(iina)printi,a[i]/b[i]}'file
alex15
tom25
10.求最大值
获取数字字段最大值[root@localhost~]#catfile
ab1
cd2
ef3
gh3
ij2
[root@localhost~]#awk'BEGIN{max=0}{if($3>max)max=$3}END{printmax}'file
3
打印第三字段最大行[root@localhost~]#awk'BEGIN{max=0}{a[$0]=$3;if($3>max)max=$3}END{for(vina)if(a[v]==max)printv}'file
ef3
gh3
11.合并file1和file2,除去重复项[root@localhost~]#catfile1
aaa
bbb
ccc
ddd
[root@localhost~]#catfile2
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,则打印。
}'file1file2
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,则打印。
}'file2file1
bbb
ccc
参考文章:/thread-2312439-1-2.html
如果觉得《linux awk 数组 shell数组和awk数组》对你有帮助,请点赞、收藏,并留下你的观点哦!