2012-02-21 134 views
119

我想从一个文本文件中删除重复项,删除重复项e.g:使用bash脚本

kavitha= Tue Feb 20 14:00 19 IST 2012 (duplicate entry) 
sree=Tue Jan 20 14:05 19 IST 2012 
divya = Tue Jan 20 14:20 19 IST 2012 
anusha=Tue Jan 20 14:45 19 IST 2012 
kavitha= Tue Feb 20 14:00 19 IST 2012 (duplicate entry) 

是否有任何可能的方式来删除使用bash脚本重复的条目?

所需的输出

kavitha= Tue Feb 20 14:00 19 IST 2012 
sree=Tue Jan 20 14:05 19 IST 2012 
divya = Tue Jan 20 14:20 19 IST 2012 
anusha=Tue Jan 20 14:45 19 IST 2012 
+17

*询问如何删除重复。问题被标记为重复* – sysfiend 2017-01-12 12:28:55

+0

*这是一个关于删除重复的问题。它被标记为重复。* – 2018-02-24 12:29:55

回答

264

您可以sort然后uniq

$ sort -u input.txt 

或者使用awk

$ awk '!a[$0]++' input.txt 
+38

使用18,500行文本文件进行测试:“sort ...”大约需要0.57秒,而“awk ...”大约需要0.08s,因为awk ...只是删除了没有重复的文件排序。 – Hugo 2013-10-19 12:38:07

+2

@Hugo我可以第二。测试2,626,198行'awk'击败'sort'。结果显示'awk'需要5.675s和'sort'需要5.675s。有趣的是,相同的记录集花费了15.1秒来执行MySQL DISTINCT查询。 – 2016-02-11 19:13:17

+0

@TeganSnyder你写的这两个命令完全相同的时间执行。没有'awk'花费更少的时间? – jarno 2016-05-17 09:59:42

7

它删除重复的,连续的线条从A F ile(模拟“uniq”)。
保留一组重复行中的第一行,将其余行删除。

sed '$!N; /^\(.*\)\n\1$/!P; D' 
+0

进行排序,还有一个用于其他用途,如果要更改文件本身就是命令'sed -i'$!N; /^\(.*\)\n\1$/!P; D'' – 2015-10-21 06:43:43

0

这可能会为你工作:

cat -n file.txt | 
sort -u -k2,7 | 
sort -n | 
sed 's/.*\t/ /;s/\([0-9]\{4\}\).*/\1/' 

或本:

awk '{line=substr($0,1,match($0,/[0-9][0-9][0-9][0-9]/)+3);sub(/^/," ",line);if(!dup[line]++)print line}' file.txt 
2

Perl的一个班轮类似@千电子伏的awk的解决方案:

perl -ne 'print if ! $a{$_}++' input 

这种变化在比较之前删除末尾的空格:

perl -lne 's/\s*$//; print if ! $a{$_}++' input 

这种变化编辑就地文件:

perl -i -ne 'print if ! $a{$_}++' input 

这种变化快速修改的地方文件,使得备份input.bak

perl -i.bak -ne 'print if ! $a{$_}++' input