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

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 最有效的最新防360拦截方法大全![通俗易懂]

    最有效的最新防360拦截方法大全![通俗易懂]首先声明,现在对于360拦截,没有任何一种方法是绝对有效的。因为存在举报,同一网站举报次数达到5次以上就会有360公司的员工接入人工审核,人工接入的话,再好的技术都是百搭,所以我这里的技术可以说绝对拦得住“机器审核”,具体“拦截时间未知”(因为不知道您的竞争对手什么时候会给您搞点小动作)我总结的方法一共有5种,都做过测试,分析出优缺点。具体如下:方法一:用框架调用主页,也就

    2022年10月23日
  • kafka 认证和鉴权方式_kafka实际应用

    kafka 认证和鉴权方式_kafka实际应用前言kafka官网关于sasl_scram鉴权Kafka消费端配置创建SCRAMCredentials依赖zk,需要先启动zk,然后在zk中创建存储SCRAM凭证:cdkafkacluster/kafka_2.11-1.1.1bin/kafka-configs.sh–zookeeperzkIP1:2181,zkIP2:2181,zkIP3:2181/lxgkafka–alter–add-config’SCRAM-SHA-256=[password=admin-secr

    2022年10月29日
  • ArcGIS路径分析_arcgis区域统计分析

    ArcGIS路径分析_arcgis区域统计分析在累积选项卡中,可以选择网络数据集中要对路径对象进行累积的成本属性。这些累积属性仅供参考;求解程序仅使用分析图层的阻抗参数所指定的成本属性来计算路径。

    2022年8月24日
  • 电平转换实现简述_为什么要进行电平转换

    电平转换实现简述_为什么要进行电平转换电平转换实现简述1.前言2.BJT和mos实现3.二极管实现4.电阻实现1.前言在设计电路时,很多情况下会出现电平不匹配的情况,最常用的方式就是增加电平转换芯片。那自然就会想到其实现思想源自于哪?如果用分离器件搭,如何能实现?下图是SN74ALVC164245的逻辑框图,包含与门和反相器,与门主要实现使能和方向控制,反向器用来实现信号传输。2.BJT和mos实现以NPN的BJT和NMOS为例来说,集电极输出和漏极输出是最简单的反相器。只不过由于BJT和MOS本身的特性,BJT只能单向传输

    2022年8月10日
  • 关系模式的函数依赖

    关系模式的函数依赖

    2021年9月14日
  • 思科静态路由配置_思科交换机trunk配置命令

    思科静态路由配置_思科交换机trunk配置命令1.配置静态路由路由器可以将不同网段之间的网络连接到一起,当路由器接收到数据包后要查看数据包中的目标IP,再检查自己的路由表,如果路由表中有和目标IP相匹配的路由条目,路由器才能将数据包按照该路由条目所指定的端口转发出去,实现不同网络之间的通信,那么路由器中的路由表是如何实现的呢?配置了路由器接口IP并为UP状态路由表中自动生成直连路由,对于非直连的路由,需通过静态路由管理员手工添加或通过配置动…

    2022年9月24日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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