|
|
使用uniq去重,添加-c参数,显示去重的个数。 i2 x5 U2 h( ~: K( a
cat host.txt |uniq -c
+ W9 D% S3 {- E4 g9 l* ~ e: D" ^, g! K
awk命令去除文件中重复数据的办法
1 X8 o5 n/ P4 k 首先准备一个文本文件,随便写个文件,包含重复行数据的即可,或者你可以参考我这里的文件:5 t7 l5 g7 y5 b& z# M+ r% j2 i, Z
# cat dup/ a4 f8 z4 U. m4 W$ |! Q( b
hello world" N* u9 q' T p
awk
/ v0 E% ^4 O# d2 y7 Fcoding ants# [' q" M5 p [ y- k: u+ m
hello world
7 s! v3 i3 Y2 K4 ~7 `: Qawk
# C% a: f$ I M/ R+ z5 Ohello world2 @! d( W# a9 [: ^$ Z- Y8 j5 T
awk+ f! F, O) U3 X" n3 O
coding ants! X9 C+ y, Q0 u& ]+ m+ h, z
coding ants# I, R& L1 w# V; Q! R
coding ants
! M7 ?2 ?. B' u- g. ^, k% Ycoding ants. u0 w4 \- l7 n! H& C( ^7 u
共有11行,后面8行都是重复的前面的几行,最终的效果应该是只显示上面重点显示的那几行,先来看看效果:/ @5 }9 L; }9 P
# awk '!a[$0]++' dup
! v" k" f/ N, l$ t' G8 R0 Hhello world6 i3 B$ w/ c% ?
awk
# [3 L8 j( n9 {1 k( c" ?coding ants4 L# m4 L |# F1 u* l, s1 w/ C
7 C, t% R( s/ n" h) u% r1 n9 e s 在《awk程序指令模型》中介绍了awk的程序指令由模式和操作组成,即Pattern { Action }的形式,如果省略Action,则默认执行 print $0 的操作。
$ s% T0 {2 E+ _( J! ? 实现去除重复功能的就是这里的Pattern:
" l' B# t( M8 T!a[$0]++
( ^% Q6 E) D: u8 t
7 R0 T0 n# j. O* a& z 在awk中,对于未初始化的数组变量,在进行数值运算的时候,会赋予初值0,因此a[$0]=0,++运算符的特性是先取值,后加1,因此Pattern等价于/ ~8 Q3 z6 i, }/ f
!0
x5 K* z& @5 |" W- V+ v& X5 Z! ?. X/ e3 p" M% e) _" V
而0为假,!为取反,因此整个Pattern最后的结果为1,相当于if(1),Pattern匹配成功,输出当前记录,对于dup文件,前3条记录的处理方式都是如此。* d2 {# O( z# K6 K2 w
当读取第4行数据“hello world”的时候,a[$0]=1,取反后的结果为0,即Pattern为0,Pattern匹配失败,因此不输出这条记录,后续的数据以此类推,最终成功实现去除文件中的重复行。4 A! s+ ?# Y0 W5 }# x
/ S) H6 r4 y% Q" Z7 M5 {
|
|