今天遇到要过滤重复域的问题,于是乎逛CU论坛,看到一个用linuxjishu/13830.html target=_blank class=infotextkey>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行被过滤掉了。