perl删除连续的重复行

时间:2012-09-17 03:00:00

标签: regex perl delete-row

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

**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=$_;}}'

怎么做???

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:5)

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

答案 2 :(得分:5)

尝试:

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

答案 3 :(得分: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)