使用Bash脚本删除重复的条目

div*_*ivz 170 bash shell

我想从文本文件中删除重复的条目,例如:

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) 
Run Code Online (Sandbox Code Playgroud)

有没有办法使用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
Run Code Online (Sandbox Code Playgroud)

kev*_*kev 381

sort然后你可以uniq:

$ sort -u input.txt
Run Code Online (Sandbox Code Playgroud)

或使用awk:

$ awk '!a[$0]++' input.txt
Run Code Online (Sandbox Code Playgroud)

  • 使用18,500行文本文件进行测试:`sort ...`大约需要0.57s而'awk ...'需要大约0.08s,因为`awk ...`只是删除重复项而不进行排序. (56认同)
  • 我贬低了这一点,因为虽然海报很开心,但是人们可能会对一个不能产生所需输出的答案感到困惑,因为它对输入进行了分类 (5认同)
  • @Hugo我可以说那个.测试2,626,198行`awk`击败`sort`.结果显示`awk`占据5.675s,"sort"占据5.675s.有趣的是,相同的记录集花了15.1秒来执行MySQL DISTINCT查询. (4认同)
  • 测试了2400万行,awk没有在20分钟内得出结果.sort + uniq在某些时间内完成了这项工作. (3认同)

Siv*_*ran 13

它从文件中删除重复的连续行(模拟"uniq").
保留一组重复行中的第一行,删除其余行.

sed '$!N; /^\(.*\)\n\1$/!P; D'
Run Code Online (Sandbox Code Playgroud)

  • 为我工作,再添加一个用于其他用途,如果你想更改文件本身,这里是命令 `sed -i '$!N; /^\(.*\)\n\1$/!P; D' <文件名>` (2认同)
  • 这太棒了 !! (2认同)

Chr*_*nat 6

类似于@kev的awk解决方案的Perl单线程:

perl -ne 'print if ! $a{$_}++' input
Run Code Online (Sandbox Code Playgroud)

此变体在比较之前删除尾随空格:

perl -lne 's/\s*$//; print if ! $a{$_}++' input
Run Code Online (Sandbox Code Playgroud)

此变体就地编辑文件:

perl -i -ne 'print if ! $a{$_}++' input
Run Code Online (Sandbox Code Playgroud)

此变体就地编辑文件,并进行备份 input.bak

perl -i.bak -ne 'print if ! $a{$_}++' input
Run Code Online (Sandbox Code Playgroud)