linux awk 数组,shell数组和awk数组

linux awk 数组,shell数组和awk数组awk终于能入门了,所以整理了该文章,内容大多来自网上。一、bash支持一维数组(不支持多维数组),没有限定数组的大小。在shell中,用括号来表示数组,数组元素用空格符号分割开。类似于C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于01.定义数组数组名array,元素abc[root@localhost~]#array=(ab…

大家好,又见面了,我是你们的朋友全栈君。

awk终于能入门了,所以整理了该文章,内容大多来自网上。

一、bash支持一维数组(不支持多维数组),没有限定数组的大小。在shell中,用括号来表示数组,数组元素用空格符号分割开。类似于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.建立数组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.多维数组,array[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函数delete array                 #删除整个数组

delete array[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++)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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/161630.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 通俗理解逻辑删除和物理删除的区别「建议收藏」

    通俗理解逻辑删除和物理删除的区别「建议收藏」一:逻辑删除逻辑删除的本质是修改操作,所谓的逻辑删除其实并不是真正的删除,而是在表中将对应的是否删除标识(is_delete)或者说是状态字段(status)做修改操作。比如0是未删除,1是删除。在逻辑上数据是被删除的,但数据本身依然存在库中。对应的SQL语句:update表名setis_delete=1whereid=1;语句表示,在该表中将id为1的信息进行逻…

  • EMD算法的简单介绍,matlab安装包的安装以及其应用![通俗易懂]

    EMD算法的简单介绍,matlab安装包的安装以及其应用![通俗易懂]EMD算法的简单介绍:从编程的角度来看,EMD是两个while循环。固有模特分量(内层while循环)满足的两个条件:(1)极值点的个数和过零点的个数相等或者最多相差为1个;(2)上下包络线的平均值为零。余项的满足条件:单调函数(部分论文上有其他的条件,外层while循环)。具体的步骤如下:1)首先使用三次样条曲线分别拟合信号…

  • 广义表_数据结构广义表的长度和深度

    广义表_数据结构广义表的长度和深度概念广义表(GeneralizedLists)是n(n≥0)个数据元素a1,a2,…,ai,…,an的有序序列,一般记作:ls=(a1,a2,…,ai,…,an)其中:ls是广义表的名称,

  • 绘图杂记【1】Python、R等绘图

    绘图杂记【1】Python、R等绘图离散分布水平条形图Discretedistributionashorizontalbarchartimportnumpyasnpimportmatplotlib.pyplotaspltcategory_names=[‘Stronglydisagree’,’Disagree’,’Neitheragreenordisagree’,’Agree’,’Stronglyagree’]results={‘Que

  • 传统请求风格 VS RestFul 风格

    传统请求风格 VS RestFul 风格RestFul风格概念Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。功能资源:互联网所有的事物都可以被抽象为资源资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。分别对应添加、删除、修改、查询。传统方式操作资源:通过不同的参数来实现不同的效果!方法单一,post和get​ http://127.0.0.1/item/queryItem.actio

  • java面试问题大全及答案大全word,逆袭面经分享

    java面试问题大全及答案大全word,逆袭面经分享一、对象的实例化1.创建对象的方式new:最常见的方式(本质是构造器)变形1:Xxx的静态方法变形2:XxBuilder/XxoxFactory的静态方法Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是publicConstructor的newInstance(Xxx):反射的方式,位于java.lang.reflect.Constructor可以调用空参、带参的构造器,权限没有要求使用clone():不调用任何构造器,当前类需

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号