用下面这个命令可以很简单方便的删除掉一个文本文件中的重复行:
awk '!x[$0]++' afile > bfile
很神奇是不是,那么它是如果做到的呢?
先说明下awk的基础知识, awk会依次读入输入文件中的每一行,来执行这个表达式'!x[$0]++',
而表达式中的'$0'就代表文件中一行数据,如果表达式的值为真就会执行动作,在这里并没有指定什么动作,默认是‘print’,
也就是输出当前行的数据,如果表达式的值为假,就什么也不做。
好了,有了这些基本知识,我们就以一个文件为例,来看下是如何删除重复行的。
简单起见,假定输入文件'afile'中只有三行文字:
aa
bb
aa
1,在读入第一行'aa'时,'$0'的值是'aa',而关联数组x这时什么也没有,x['aa']是空,所以‘x[$0]++’的值为假,因为有‘!’求反,最终该值为真,所以输出第一行'aa'
2,同样的道理,在读入第二行'bb'时,关联数组x中只有x['aa']=1,所以x['bb']也是空,最终该值为真,输出第二行'bb'
3,在读入第三行时,由于关联数组中x['aa']=1,所以x['aa']++的值为真值1,所以'!'求反的结果,最终值为假,不输出第三行的'aa
同样以下再有‘aa'的行也是不会输出的,达到了删除重复行的效果。