|
|
使用uniq去重,添加-c参数,显示去重的个数。
+ c* M- P$ o+ k1 Ccat host.txt |uniq -c
' F3 r! ~; p) A. {6 a I9 Z. g$ @& i. Z0 V% ]2 b
awk命令去除文件中重复数据的办法( ]: M6 P5 _/ |; l
首先准备一个文本文件,随便写个文件,包含重复行数据的即可,或者你可以参考我这里的文件:
9 y q J$ j& q6 z# cat dup
1 ]- g" b+ _# ~2 w- U! rhello world7 R, I. u0 ~7 r* F+ G1 i$ t
awk+ `$ ]1 T4 m- D0 f1 L% L; E
coding ants( S6 M+ S4 L5 z. Y
hello world
5 U, E) c& y# F' W; gawk4 {; ~8 s- X* a
hello world
- ^4 d7 @" L9 J5 ^( Cawk
: f" h0 W9 y' J* G" Bcoding ants
8 M. n) A, Y: j2 Lcoding ants$ Z% r+ O( v. W* p3 }
coding ants/ d( k) ]! d) S: f4 x& o$ C- E- ^
coding ants
8 I0 e1 L( I0 s7 N: e7 g9 Q 共有11行,后面8行都是重复的前面的几行,最终的效果应该是只显示上面重点显示的那几行,先来看看效果:& g2 z0 Q Z* f6 o9 ^$ Z" \
# awk '!a[$0]++' dup) r: s$ Y( d5 H0 @$ l3 g2 l
hello world
2 f, h/ m$ Z8 F: tawk
; c- @$ X% y" C8 p9 p; _$ p' Ccoding ants
! |+ M/ X* R% y" ^
6 C: D1 {4 W2 w& w 在《awk程序指令模型》中介绍了awk的程序指令由模式和操作组成,即Pattern { Action }的形式,如果省略Action,则默认执行 print $0 的操作。
0 G% Y! I& f0 w- m* O) M/ ] 实现去除重复功能的就是这里的Pattern:
3 P% s& }0 e- O+ }- E2 l* |8 v!a[$0]++
$ `# p! e! T; w3 `4 I* w. R
+ F! u% d6 [' N0 z% J0 @ 在awk中,对于未初始化的数组变量,在进行数值运算的时候,会赋予初值0,因此a[$0]=0,++运算符的特性是先取值,后加1,因此Pattern等价于
, W6 ?$ X. {$ ~!0
5 y/ Y* i+ z, f" |0 ~' ]& f6 ?& u4 v, g! v/ w4 A* t
而0为假,!为取反,因此整个Pattern最后的结果为1,相当于if(1),Pattern匹配成功,输出当前记录,对于dup文件,前3条记录的处理方式都是如此。
- P& o Y7 b" M) H 当读取第4行数据“hello world”的时候,a[$0]=1,取反后的结果为0,即Pattern为0,Pattern匹配失败,因此不输出这条记录,后续的数据以此类推,最终成功实现去除文件中的重复行。
9 m. ~ O" m# m5 b. c/ l+ x6 s( r" [- J4 C
|
|