순서를 유지하면서 인접한 중복 줄을 제거하십시오.


11

각각 여러 번 반복되는 이름을 가진 하나의 열이있는 파일이 있습니다. 동일한 이름의 다른 반복에 인접하지 않은 동일한 이름의 다른 반복을 유지하면서 각 반복을 하나로 반복하려고합니다.

예를 들어 왼쪽을 오른쪽으로 돌리고 싶습니다.

Golgb1    Golgb1    
Golgb1    Akna
Golgb1    Spata20
Golgb1    Golgb1
Golgb1    Akna
Akna
Akna
Akna
Spata20
Spata20
Spata20
Golgb1
Golgb1
Golgb1
Akna
Akna
Akna

이것이 내가 사용하고있는 것입니다 : perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt 그러나이 방법은 왼쪽에서 한 명의 대표 만 유지합니다 (즉, Golb1과 Akna는 반복되지 않습니다).

인접하지 않은 여러 블록에서 반복되는 이름을 유지하면서 각 블록마다 고유 한 이름을 유지하는 방법이 있습니까?

답변:


23

uniq 당신을 위해 이것을 할 것입니다 :

$ uniq inputfile
Golgb1
Akna
Spata20
Golgb1
Akna

2
굉장히 쉬웠어요! 감사!
Age87

@ Age87 Unix는 훌륭합니다! 복제본이 이미 인접 해 있거나 (또는 ​​인접하지 않은 것을 제거하지 않기를 원하기 때문에) 작동합니다. 일반적으로 권장 사항은 다음과 같습니다.sort | uniq
jpaugh

1
간결하게, sort -u(:
DopeGhoti


6

이것을 시도하십시오-이전 줄을 저장하고 현재 줄과 비교하십시오

$ perl -ne 'print if $p ne $_; $p=$_' ip.txt
Golgb1
Akna
Spata20
Golgb1
Akna

당신은 또한 태그를 uniq했습니다-당신은 그것을 시도 했습니까?

$ uniq ip.txt
Golgb1
Akna
Spata20
Golgb1
Akna

1

sed를 사용하면 다음과 같이 수행 할 수 있습니다.

sed -e '$!N;/^\(.*\)\n\1$/!P;D' input_file

여기서 우리는 언제든지 2 줄의 패턴 공간에 있습니다. 둘 사이의 비교가 실패하면 첫 번째 것을 인쇄하고 앞쪽에서 잘라 내고 다음 줄을 패턴 공간에 추가하십시오. 헹굼 ... 반복

이용 펄을 소리내어 먹는다 모드에서 우리는 정규식 당신을위한 비교를 수행하는 적용되는 하나의 긴 문자열로 전체 파일을 처리합니다.

perl -0777pe 's//$1/ while /^(.*\n)\1+/gm' input_file

0

Rakesh Sharma의 sed 솔루션에 대한 질문.

다음과 같은 입력 파일이있는 경우 :

-126.1 48.206
-126.106 48.21
-126.11 48.212
-126.114 48.214
-126.116 48.216
-126.118 48.216
-126.128 48.222
-126.136 48.226

그리고 당신은 출력 파일을 원합니다 :

-126.1 48.206
-126.106 48.21
-126.11 48.212
-126.114 48.214
-126.116 48.216
-126.128 48.222
-126.136 48.226

누락 된 점에 유의하십시오.

-126.118 48.216

원하는 명령이 솔루션과 유사하다는 것을 알고 있습니다.

sed -e '$!N;/^\(.*\)\n\1$/!P;D' input_file

두 열을 모두 인쇄하기 위해 올바른 방법으로 변경할 수 없으며 열 2 값으로이 특별한 방식으로 만 정렬 할 수 있습니다. 팁이 있습니까?


sed -e '$!N' -e '/.*\.\([0-9]*\)\n.*\.\1$/!{P;D;}' -e 's/\n.*//;s/^/\n/;D' 후속 반복 요소를 삭제합니다. 참고 :이 필요합니다 GNU sed. 들어 POSIX행동, 그것은 약간의 변경이 필요합니다.
Rakesh Sharma
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.