2012-09-17 5 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{$_}++' 

는하지만 난 OUPUT 내가이 oneliner을 시도

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

되고 싶어하지만,이 나던 아무것도 할 수 있지만, 바로 입력을 인쇄합니다.

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 

결과 : 당신은 또한 awk하여이 작업을 수행 할 수

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

: 나는 또한 얼마나 많은 중복을 추적하고 싶었다

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

감사합니다. @steve –

+1

1M 회선이있는 파일의 시간 : uniq : 1.579 초. awk : 10.615 초. – erik

0

억제 만 연속 중복을 생략했다.

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) 

이 아니라 영업 이익은 질문을 정확하게 있지만, 다른 사람이 유용하게 사용할 수있는 변종이다

관련 문제