Shell数组和awk数组

电脑杂谈  发布时间:2020-05-06 19:38:21  来源:网络整理

awk数组下标_awk数组初始化_awk数组

awk终于可以开始使用了,所以我主要是从Internet整理这篇文章的.

一个,bash支持一维数组(不支持多维数组)awk数组初始化,并且对数组的大小没有限制. 在外壳中,括号用于表示数组,并且数组元素由空格符号分隔. 与C语言类似,数组元素的下标从0开始编号. 要获取数组中的元素,您需要使用下标,该下标可以是整数或算术表达式,其值应大于或等于0

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

小例子:

#!/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

两个,awk数组

awk数组是一个关联数组(Associative Arrays),支持多维数组,下标可以是数字和字符串. 因为不需要事先声明数组名称和元素,也不需要指定元素的数量,所以awk数组使用起来非常灵活.

1. 创建一个数组

awk数组下标_awk数组初始化_awk数组

array[index]=value 数组名array,下标index以及相应的值value

2. 读取数组值

{for (item in array)  print array[item]} # 输出的顺序是随机的
{for(i=1;i<=len;i++)  print array[i]}    # len 是数组的长度

3. 多维数组,数组[index1,index2,...]: SUBSEP是数组索引分隔符. 您可以预先设置SUBSEP,也可以直接在SUBSEP上输入要使用的分隔符,例如:

[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 array                 #删除整个数组
delete array[item]           #删除某个数组元素(item)

awk数组_awk数组下标_awk数组初始化

5. 排序: awk中的asort函数可以对数组的值进行排序,但是排序后的数组索引从1更改为数组的长度. 在gawk 3.1.2之后的版本中,还存在一个asorti函数,该函数不基于关联数组的值,而是根据关联数组的下标进行排序的. )作为下标,但是array的数组值在排序后变为原始下标,除非您指定其他参数,例如: asorti(aawk数组初始化,b).

[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

awk数组_awk数组初始化_awk数组下标

8. 通过split函数创建一个数组: 该数组的下标是一个从1开始的数字

split(s, a [, r]) # s:string, a:array name,[,r]:regular expression。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-200910-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...