以這個 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