3

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

**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

4 回答 4

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
于 2012-09-17T03:08:02.870 回答
5
$ perl -ne 'print $_ unless $_ eq $prev; $prev = $_'
于 2012-09-17T03:04:31.407 回答
5

尝试:

perl -ne 'print unless (defined($prev) && ($_ eq $prev)); $prev=$_'
于 2012-09-17T03:04:40.373 回答
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)
于 2015-07-22T14:18:01.993 回答