用awk数组去除重复域awk‘!a[$1]++’
今天遇到要过滤重复域的问题,于是乎逛CU论坛,看到一个用awk数组过滤的方法,很精简,在这里贴出来和大家分享下。
以这个 testawk 文本为例:
1 2 3
1 2 2
2 2 2
3 4 4
3 4 5
2 2 2
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
1 4 3
先要讲解下 awk'!a[$1]++' 这种格式的每个部分的意义。
1、awk数组知识
2、awk的基本命令格式 awk 'pattern{action}'
省略action时,默认action是{print},如awk '1'就是awk '1{print}'
3、var++的形式:先读取var变量值,再对var值+1
awk处理第一行时:先读取a[$1]值再自增,a[$1]即a[1]值为空(0),即为awk '!0',
即为awk '1',即为 awk'1{print}'
awk处理第二行时: 先读取a[$1]值再自增,a[$1]即a[1]值为1,即为awk '!1',
即为awk '0',即为awk '0{print}'
效果就是有重复$1的行只有第一次出现被打印,其他的都过滤了。
实践下:
$ awk '!a[$1]++' testawk
1 2 3
2 2 2
3 4 4
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
可以看出第一个域重复的2、5、6、13行都被过滤掉了。
如果要顾虑的时候参考的不止一个域那就可以在方括号里写上要参考的域,例如 awk '!a[$1 $3]++'
测试下:
$ awk '!a[$1$ $3]++' testawk
1 2 3
1 2 2
2 2 2
3 4 4
4 4 4
5 5 5
6 6 6
7 7 7
8 8 8
可以看到第6、13行被过滤掉了。
您可能感兴趣的文章:
用awk数组去除重复域awk‘!a[$1]++’
awk单行脚本快速参考
sed、awk调用shell变量的方法
Linux awk 命令
awk关联数组的应用一例
shell 字符串的存储 详解
awk基础知识(11)-数组下标字符串化
awk中让人头疼的system()函数
awk基础知识(1)-使用规则
awk应用实例(经典awk例子)