2012-09-17 167 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)