以这个 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
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
如果要顾虑的时候参考的不止一个域那就可以在方括号里写上要参考的域,例如 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行被过滤掉了。