awk数组

awk的数组,是一种关联数组(Associative Arrays),下标可以是数字和字符串。因无需对数组名和元素提前声明,也无需指定元素个数 ,所以awk的数组使用非常灵活。

  1. 不需要正式定义,一个数组在使用时被定义;
  2. 数组元素的初始值为0或空字符串,除非他们被显示的指定初始化;
  3. 数组可以自动扩展;
  4. 下标可以使字符串。
基础操作
  1. 建立数组
# 数组名array,下标index以及相应的值value。
array[index] = value  
  1. 读取数组内容
 # 输出的顺序是随机的
{ for (item in array)  print array[item]}
 # Len 是数组的长度
{len=length(array);for(i=1;i<=len;i++)  print array[i]}
  1. if(key in array) 通过这种方法判断数组中是否包含”key”键值。
  2. 删除数组元素:delete arr['key']可以用于删除数组元素
  3. 多维数组,array[index1,index2,……]:SUBSEP是数组下标分割符,默认为“\034”。可以事先设定SUBSEP,也可以直接在SUBSEP的位置输入你要用的分隔符,如:
awk 'BEGIN{SUBSEP=":";array["a","b"]=1;for(i in array) print i}'
a:b
awk 'BEGIN{array["a"":""b"]=1;for(i in array) print i}'
a:b
文件内容去重

我们可以利用awk的数组来对文件内容去重,假设待分析的文本内容如下:

# cat test.txt
aaa 123
aaa 123
aaa 456
bbb 678
bb  789
bbb 678

如果我们要对其中重复的行去重,可以这样处理。

awk '!c[$0]++' test.txt > new.txt
cat new.txt
aaa 123
bbb 678
bb  789

解释一下:

  1. awk中$0是读入的行内容。
  2. c[$0]是awk数组,默认值是0,数组名称随便定义。
  3. !优先级高于++,先判断!c[$0]再自增,后续读入的重复内容就会被过滤,而且还会统计出重复出现的次数。
# 只显示重复出现的内容
awk 'c[$0]++' test.txt
aaa 123
bbb 678
# 统计重复内容出现的次数
awk '{++c[$0]} END{for(i in c) print i"\t"c[i]}' test.txt
aaa 456 1
bb  789 1
aaa 123 2
bbb 678 2
# 统计第一个字段出现的次数,有时候可能根据日志中的IP地址来统计某个IP访问网站的次数
awk '{++c[$1]} END{for(i in c) print i"\t"c[i]}' test.txt 
bb  1
aaa 3
bbb 2
文件内容合并

假设我们要合并以下两个文件,重复的数据只保留一份。

cat file1
aaa
bbb
ccc
ddd
cat file2
aaa
eee
ddd
fff
awk 'NR==FNR{a[$0]=1;print};NR>FNR{if(!(a[$0])){print}}' file1 file2
aaa
bbb
ccc
ddd
eee
fff
文件内容对比

假设要比较的文件内容同上

awk 'NR==FNR{a[$0]=1};NR>FNR{if(!(a[$0])){print }}' file2 file1
bbb
ccc

我是咕咕鸡,一个还在不停学习的全栈工程师。
热爱生活,喜欢跑步,家庭是我不断向前进步的动力。

你可能感兴趣的:(awk数组)