|
|
使用uniq去重,添加-c参数,显示去重的个数。
6 @- j& e# l' i2 v; ?; ]cat host.txt |uniq -c 7 J$ J e) ~0 j+ m
+ q2 t6 h9 U& E' D/ Yawk命令去除文件中重复数据的办法
4 p# B8 j- E1 w* p 首先准备一个文本文件,随便写个文件,包含重复行数据的即可,或者你可以参考我这里的文件:
/ s' t' ]$ s1 A* Y# cat dup+ d+ A: J, k; o( I, L) ~1 b4 J ^" R
hello world/ X3 N8 j$ O4 I7 ]8 `0 I- O% ]9 o$ n
awk) ]* v8 E% R7 c% o0 d h4 `
coding ants
( g3 D3 Y- [; G2 Q. {+ z# Khello world
/ y- V& V" m# b) Y7 y H3 \awk
/ O* V) \- X4 yhello world6 @* Q" I9 [& \6 a, o
awk
) [7 y1 L6 D0 x0 h. a3 `, c2 Icoding ants) g& @- D/ g B$ u( s9 N
coding ants. v5 x; U8 F0 j5 O, |6 Z
coding ants& ~$ y2 b5 k3 ~) q) {2 ~
coding ants
a5 ~: E% ~) U* H: [9 Z% v$ g6 S 共有11行,后面8行都是重复的前面的几行,最终的效果应该是只显示上面重点显示的那几行,先来看看效果:- `, K: k; S, F. [# n
# awk '!a[$0]++' dup6 U+ `. A. W- h4 x+ Z, w
hello world
3 K- z! c' C" d. e/ zawk
3 j2 T9 s; {! \9 o" |' I$ ycoding ants
+ _, a( q( F3 a- t |) ]8 d* b9 {+ g4 L K. ? k* W! y9 t
在《awk程序指令模型》中介绍了awk的程序指令由模式和操作组成,即Pattern { Action }的形式,如果省略Action,则默认执行 print $0 的操作。
; ^; O2 g* l' x' c 实现去除重复功能的就是这里的Pattern:
7 @) W) z1 p7 ^) P" @!a[$0]++
! F( A4 S" W4 G0 E- o# |; @! H7 G" Z# c) f3 _. {' G
在awk中,对于未初始化的数组变量,在进行数值运算的时候,会赋予初值0,因此a[$0]=0,++运算符的特性是先取值,后加1,因此Pattern等价于# B( g) c" h, Y* r6 r
!0: w4 E4 u' B7 V' M- s
' }7 t. B9 E- w) E" g 而0为假,!为取反,因此整个Pattern最后的结果为1,相当于if(1),Pattern匹配成功,输出当前记录,对于dup文件,前3条记录的处理方式都是如此。! E- R3 P- [6 O
当读取第4行数据“hello world”的时候,a[$0]=1,取反后的结果为0,即Pattern为0,Pattern匹配失败,因此不输出这条记录,后续的数据以此类推,最终成功实现去除文件中的重复行。2 v8 p B) J' m {% m ?9 O
$ A5 B3 O5 v. q e: x9 H
|
|