日期:2014-05-16  浏览次数:20572 次

Linux系统下如何删除文本中的重复行

????? 在Linux系统中,如果要删除文本中的重复行,可以如何做?

????? 平时比较常用的方式是采用sort和uniq结合来处理.但如果要更进一步,根据文本中的某一列,而不是整行

来进行是否重复的判断,并对重复行进行删除,要如何做呢?

????? Google了一些资料,如下:

????? 1.?枪声依旧 Linux下利用awk进行文本统计

????? 2. sed与awk去除重复行

????? 3. awk 不排序删除重复行

?

????? 其中,在1)中,介绍了下面这种方法来解决上面提出的问题:

awk '!a[$0]++' src.txt > dest.txt 

?

????? 而对这种方法的解释,在3)做了描述,下面是一段转贴:

?简要解释一下,awk 的基本执行流程是,对文件的每一行,做一个指定的逻辑判断,如果逻辑判断成立,则执行指定的命令;如果逻辑判断不成立,则直接跳过这一行。

我们这里写的 awk 命令是 !x[$0]++,意思是,首先创建一个 map 叫 x,然后用当前行的全文 $0 作为 map 的 key,到 map 中查找相应的 value,如果没找到,则整个表达式的值为真,可以执行之后的语句;如果找到了,则表达式的值为假,跳过这一行。由于表达式之后有 ++,因此如果某个 key 找不到对应的 value,该 ++ 操作会先把对应的 value 设成 0,然后再自增成 1,这样下次再遇到重复的行的时候,对应的 key 就能找到一个非 0 的 value 了。

注:该处的map类似于array数组,只不过在awk中叫array不恰当。