순서를 유지하면서 인접한 중복 행을 제거합니다.

순서를 유지하면서 인접한 중복 행을 제거합니다.

각 열의 이름이 여러 번 반복되는 열이 있는 파일이 있습니다. 동일한 이름의 다른 반복과 인접하지 않은 동일한 이름의 다른 반복을 유지하면서 각 반복을 하나로 압축하고 싶습니다.

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

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는 중복되지 않습니다).

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

답변1

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

$ uniq inputfile
Golgb1
Akna
Spata20
Golgb1
Akna

답변2

Awk해결책:

awk '$1 != name{ print }{ name = $1 }' file.txt

산출:

Golgb1
Akna
Spata20
Golgb1
Akna

답변3

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

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

uniq또한 태그됨 - 시도해 보셨나요?

$ uniq ip.txt
Golgb1
Akna
Spata20
Golgb1
Akna

답변4

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의 값만 정렬할 수 있습니다. 어떤 팁이 있나요?

관련 정보