失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > linux awk 数组 shell数组和awk数组

linux awk 数组 shell数组和awk数组

时间:2023-10-10 02:03:32

相关推荐

linux awk 数组 shell数组和awk数组

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数组》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。