以这个 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]++' 这种格式的每一个部分的意义。
一、awk数组知识
二、awk的基本命令格式 awk 'pattern{action}'
省略action时,默认action是{print},如awk '1'就是awk '1{print}'
三、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的行只有第一次出现被打印,其余的都过滤了。ide
实践下:
$ 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测试
能够看出第一个域重复的二、五、六、13行都被过滤掉了。spa
若是要顾虑的时候参考的不止一个域那就能够在方括号里写上要参考的域,例如 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
能够看到第六、13行被过滤掉了。orm