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)


相关推荐

  • 西门子scl语言编程教程_西门子scl编程

    西门子scl语言编程教程_西门子scl编程《在西门子PLC中使用SCL语言编程的技巧》由会员分享,可在线阅读,更多相关《在西门子PLC中使用SCL语言编程的技巧(6页珍藏版)》请在人人文库网上搜索。1、在西门子PLC中使用SCL语言编程的技巧前言:两年半前我就在工控网上发表了有关SCL编程的知识#lt;#lt;在S型PLC中使用高级语言编程#gt;#gt;,但发表完后,即使我自己都从没有把任何使用SCL编写的程序用到实际控制中,当时的感觉…

  • 分布式系统下的纠删码技术(一) — Erasure Code (EC)

    分布式系统下的纠删码技术(一) — Erasure Code (EC) 近几个月主要参与一个分布式存储系统的纠删码部分(用于数据容错),纠删码在学术界出现比较早,现在ceph,微软的存储系统,Hadoop3.0等都用了EC。文章会分为多篇,主要将ErasureCode,LRC, 以及相关的数学基础,作为学习总结。 一、纠删码简介      分布式系统需要在硬件失效等故障发生后仍然能继续提供服务。就数据而言,HDFS采用每份数据3副本的方式,保…

    2022年10月29日
  • 航信金税接口「建议收藏」

    航信金税接口「建议收藏」我看到很多的航信接口,但是我发现好多都是中间商在宣传自己的接口,偶尔几个也是要积分的,像我这种白piao党那是没有积分的,下面是我给现在在做航信接口的基友们的一点建议前期条件1.本地电脑的金税环境(开票软件,智税集成)2.航信测试盘,测试注册文件(必需品)3.开发文档(一般没有,有的话也是经过二次修改过的那种)一些需要注意的地方:引用的dll是taxCardx,这个一般装了金税环境…

  • Java中分割字符串

    Java中分割字符串plit 的实现直接调用的 matcher 类的 split 的方法。在使用String.split方法分隔字符串时,分隔符如果用到一些特殊字符,可能会得不到我们预期的结果。在正则表达式中有特殊的含义的字符,我们使用的时候必须进行转义,示例:public class StringSplit { public static void main(String[] args) { …

  • bigdecimal保留2位小数_bigdecimal保留两位小数显示00

    bigdecimal保留2位小数_bigdecimal保留两位小数显示00作者:RaphetS第一种方法使用DecimalFormat类举个例子,假如我们需要保留两位小数,我们可以这样写DecimalFormatdf=newDecimalFormat(“0.00”);测试如下:doubled=0.200;DecimalFormatdf=newDecimalFormat(“0.00”);System.out.println(df.format(d))…

  • pyhcarm激活码破解方法

    pyhcarm激活码破解方法,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

发表回复

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

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