awk处理案例八--效果如uniq命令

【场景】--达到uniq命令的效果

1. 若是去除重复行;我们很快会想到

1 cat input.txt | sort | uniq
2 awk '! a[$0]++' input.txt

2. 若要只实现像命令uniq的效果呢?
例如文本file

aa
aa
fff
ee
fff
fff
ee
ee
bb
bb
aa
View Code

效果如“uniq file”

[li0924@localhost awk]$ uniq file
aa
fff
ee
fff
ee
bb
aa

若用awk来怎么实现呢?

awk '{a[NR]=$0}END{s=a[1];for(i=1;i<=NR;i++){s=a[i]==a[i+1]?s:s RS a[i+1]} printf s}' file

【解析】
   思路把结果放到字符串s中;根据列跟后一列进行判断是否相等;若相等就不对其操作;若不一致;就加上后一列;

3. 实现效果如sort | uniq -u呢?即只打印不重复项

 1 [li0924@localhost lottu]$ cat lottu01 
 2 aa
 3 aa
 4 fff
 5 ee
 6 fff
 7 fff
 8 ee
 9 ee
10 bb
11 bb
12 aa
13 456
14 fe
15 861
16 [li0924@localhost lottu]$  cat lottu01 | sort |uniq -u
17 456
18 861
19 fe
测试uniq -u

awk实现代码如下:

awk '{a[$0]++}END{for(i in a){if(a[i]==1)print i}}'

【解析】
  用数组a来表示重复的次数;次数为1表示没有重复的;

4. 实现效果如sort | uniq -d呢?即只打印重复项

1 [li0924@localhost lottu]$  cat lottu01 | sort |uniq -d
2 aa
3 bb
4 ee
5 fff
测试uniq -d

awk实现代码如下:

awk '{a[$0]++}END{for(i in a){if(a[i]>1)print i}}' 

【解析】
 有了上面的解释;这个很好理解了

 

posted @ 2013-09-18 08:10  lottu  阅读(517)  评论(0)    收藏  举报