중복 행 제거

중복 행 제거

다음과 같은 줄이 포함된 파일이 있습니다(파일 헤더만 해당).

    "chrom" "startA" "stopA" "genesA" "startB" "stopB" "genesB" "test"
    1 315121 317607 "gene2" 315521 317204 "gene3" 1684
    1 315521 317204 "gene3" 315121 317607 "gene2" 1684
    1 407644 408993 "gene4" 408421 409504 "gene5" 573
    1 407644 408993 "gene4" 408616 410013 "gene6" 378
    1 408421 409504 "gene5" 407644 408993 "gene4" 573
    1 408421 409504 "gene5" 408616 410013 "gene6" 889
    1 408616 410013 "gene6" 407644 408993 "gene4" 378
    1 408616 410013 "gene6" 408421 409504 "gene5" 889
    1 408616 410013 "gene6" 409682 411483 "gene7" 332
....

동일한 라인(동일한 유전자 쌍, 시작 및 중지 위치의 순서만 다를 뿐 정확히 동일함)이 있으며 중복된 라인을 제거해야 합니다. 예를 들어:

1 315121 317607 "gene2" 315521 317204 "gene3" 1684
1 315521 317204 "gene3" 315121 317607 "gene2" 1684

동일합니다. 유전자 2와 3의 조합이지만 순서만 다를 뿐인데 그중 하나를 삭제하고 싶습니다.

이것이 내가 원하는 결과입니다:

"chrom" "startA" "stopA" "genesA" "startB" "stopB" "genesB" "test"
    1 315121 317607 "gene2" 315521 317204 "gene3" 1684
    1 407644 408993 "gene4" 408421 409504 "gene5" 573
    1 407644 408993 "gene4" 408616 410013 "gene6" 378
    1 408421 409504 "gene5" 408616 410013 "gene6" 889
    1 408616 410013 "gene6" 409682 411483 "gene7" 332

나는 이 작업을 수행하는 방법을 알고 있습니까? 감사해요

답변1

당신은 시도 할 수 있습니다:

awk '{key = $4 < $7 ? $4 SUBSEP $7 : $7 SUBSEP $4} !seen[key]++' file

중복 기록을 제거하는 데 필요한 최소한의 콘텐츠를 저장합니다.

!seen[key]++"키"가 처음으로 표시될 때만 레코드를 인쇄하는 "유명한" awk 관용구입니다.

답변2

첫 번째 열의 값을 기준으로 2-3-4 및 5-6-7 열의 트리플을 정렬할 수 있습니다.

perl -lane '@F[1,2,3,4,5,6] = @F[4,5,6,1,2,3] if $F[1] > $F[4]; print "@F"'

그런 다음 실행하여 sort -u중복 항목을 제거할 수 있습니다(그러나 열 이름을 특별하게 처리해야 합니다).

답변3

각 줄을 확인하세요.

  • 첫 번째 필드 앞에 공백이 없습니다.
  • 필드 사이에는 정확히 1개의 공백이 있습니다.
  • 마지막 필드에는 공백이 없습니다.

gnu sed를 사용하면 데이터가 "data" 파일에 있습니다.

sed -nE ':s G;/(\w+\s)(\w+\s)(\w+\s)(\S+\s)(\w+\s)(\w+\s)(\S+\s)(\w+)\n(.+\n)*\1\w+\s\6\7\w+\s\3\4\8/b; h;P' data

관련 정보