특정 텍스트가 포함된 중복 줄 제거

특정 텍스트가 포함된 중복 줄 제거

백만 줄이 포함된 큰 텍스트 파일이 있습니다. 내 특정 텍스트와 일치하는 동일한 줄을 찾고 첫 번째 항목을 그대로 유지하고 싶습니다. 어떤 아이디어가 있나요?

따라서 알고리즘은 대략 다음과 같아야 합니다.

For all lines in text file
   Find duplicate lines
   If duplicated line contains our text
      Remove all these lines except the first one

예를 들어, "Word"라는 텍스트의 중복된 줄을 찾고 있습니다.
파일 예:

Test1 Test2 Test3 Test4 Test5
Test1 Test2 Test3 Test4 Test5
Word1 Word2 Word3 Word4 Word5
Test1 Test2 Test3 Test4 Test5
Word1 Word2 Word3 Word4 Word5

결과물 파일:

Test1 Test2 Test3 Test4 Test5
Test1 Test2 Test3 Test4 Test5
Word1 Word2 Word3 Word4 Word5
Test1 Test2 Test3 Test4 Test5

답변1

간단한 접근 방식은 다음과 같습니다.

awk '!/Word/ || !a[/Word/]++' file

awk 'm=!/Word/ || !a[!m]++'

즉, Word 없이 모든 줄을 인쇄하거나 Word가 있는 경우 Word를 사용하여 첫 번째 줄만 인쇄하고 나머지는 억제합니다.

참고: Word의 콘텐츠를 향상해야 할 수도 있습니다. 연습용으로 남겨두겠습니다.

답변2

부분 정규식 비교를 수행하려는 경우(참조https://stackoverflow.com/questions/65621325/how-do-i-find-the-text-that-matches-a-pattern):

$ awk -v regexp='Word' '!(($0 ~ regexp) && seen[$0]++)' file
Test1 Test2 Test3 Test4 Test5
Test1 Test2 Test3 Test4 Test5
Word1 Word2 Word3 Word4 Word5
Test1 Test2 Test3 Test4 Test5

또는 부분 문자열 비교를 원하는 경우:

$ awk -v string='Word' '!(index($0,string) && seen[$0]++)' file
Test1 Test2 Test3 Test4 Test5
Test1 Test2 Test3 Test4 Test5
Word1 Word2 Word3 Word4 Word5
Test1 Test2 Test3 Test4 Test5

다른 유형의 일치를 원할 경우 질문을 편집하여 명확히 하십시오.

답변3

다음을 시도해 볼 수 있습니다.

sed '0,/Word/b;/Word/d' file

"Word"와 일치하는 줄 삭제:

/Word/d 

파일 시작 부분부터 "Word"와 일치하는 첫 번째 줄까지 스크립트 끝으로 분기합니다. 즉, 삭제 명령을 건너뜁니다.

0,/Word/b

~에서이 스택오버플로우 게시물.

관련 정보