2012-09-17 170 views
3

我想删除连续的重复行。即例如perl删除连续的重复行

**test.txt** 
car 
speed is good 
bike 
slower than car 
plane 
super fast 
super fast 
bullet train 
super fast 

这除去第一次出现以外的所有重复行。

perl -ne 'print unless $a{$_}++' 

但我想在输出中是

**test.txt** 
    car 
    speed is good 
    bike 
    slower than car 
    plane 
    super fast 
    bullet train 
    super fast 

我想这oneliner但这并不做任何事情,只是打印输入。

perl -00 -F'<\w+>|</\w+>' -i.bak -lane 'foreach(@F){if ($_=~/\w+/ && ($a ne $_)){print "$_";$a=$_;}}' 

如何做到这一点???

+2

如果您在Linux上(或者在Windows上使用Cygwin),请改用[uniq(1)](http://unixhelp.ed.ac.uk/CGI/man-cgi?uniq)。 –

回答

4

尝试:

perl -ne 'print unless (defined($prev) && ($_ eq $prev)); $prev=$_' 
+0

非常感谢@epsalon。 –

+1

1M行文件的时间:0.727秒。 – erik

5
$ perl -ne 'print $_ unless $_ eq $prev; $prev = $_' 
+0

这会警告'$ prev'未定义 – epsalon

+1

不,它不会。 “perl -nwe”会。 –

+0

谢谢@VipulVedPrakash –

10

你为什么不只是使用uniq

uniq file.txt 

结果:

car 
speed is good 
bike 
slower than car 
plane 
super fast 
bullet train 
super fast 

您还可以awk做到这一点:

awk 'line != $0; { line = $0 }' file.txt 
+0

非常感谢@steve –

+1

1M行文件的时间:uniq:1.579秒。 awk:10.615秒。 – erik

0

我也想跟踪有多少重复的被抑制,只跳过连续的重复。

虽然这不是正是OP问,它是其他人可能觉得有用的变体:

perl -ne 'if (defined($pr) && ($_ eq $pr)) {$cnt++;} else {print "... (+$cnt)\n" if ($cnt); print; $cnt=0; $pr=$_;}' 

它产生这样的事情与我的数据(数据库恢复日志):

COPY 9 
COPY 0 
... (+2) 
COPY 5 
COPY 0 
... (+1) 
COPY 24 
ALTER TABLE 
... (+23) 
CREATE INDEX 
... (+73)