고유한 행 찾기, 특정 열 무시

고유한 행 찾기, 특정 열 무시

나는 파일을 탐색하고 안정적일 것으로 예상되는 필드에서 다른 행을 찾고, 달라질 것으로 알고 있는 필드의 차이점을 무시할 수 있기를 원합니다.

2, 5, 6열을 무시하고 싶습니다. 1, 3, 4열의 변경사항은 보고할 가치가 있습니다.

예를 들어:

여기에 이미지 설명을 입력하세요.

처음 두 행이 변경 내용을 포함하는 것으로 보고되는 것을 원하지 않지만 두 번째 쌍은 두 행으로 보고되기를 원합니다.

파일이 정렬되었습니다

sort -k1,1 -k3,3n -k4,4n

어떤 제안이 있으십니까? (질문 형식이 죄송합니다. 저는 여기에 처음 왔습니다)

이미지가 아닌 데이터의 경우 앞과 뒤에 행을 추가하세요.

NZ_CP020102     B4U62_RS00130   26852   28543   DNA polymerase III subunit gamma/tau    NCIB3610a
NZ_CP020102     TESTGENOMECL_26 26852   28543   DNA polymerase III subunit gamma/tau    TESTGENOME
NZ_CP020102     B4U62_RS00135   28567   28890   YbaB/EbfC family nucleoid-associated protein    NCIB3610a
NZ_CP020102     TESTGENOMECL_27 28567   28890   YbaB/EbfC family nucleoid-associated protein    TESTGENOME
NZ_CP020102     B4U62_RS00140   28905   29501   recombination protein RecR      NCIB3610a
NZ_CP020102     TESTGENOMECL_28 28905   29501   recombination protein RecR      TESTGENOME
NZ_CP020102     B4U62_RS00145   29519   29743   DUF2508 domain-containing protein       NCIB3610a
NZ_CP020102     TESTGENOMECL_29 29519   29743   DUF2508 domain-containing protein       TESTGENOME
NZ_CP020102     B4U62_RS00150   29810   30073   sigma-K factor-processing regulatory protein BofA       NCIB3610a
NZ_CP020102     TESTGENOMECL_30 29810   30073   sigma-K factor-processing regulatory protein BofA       TESTGENOME
NZ_CP020102     B4U62_RS00155   30317   31869   16S ribosomal RNA       NCIB3610a
NZ_CP020102     TESTGENOMECL_31 30317   31870   16S ribosomal RNA       TESTGENOME
NZ_CP020102     B4U62_RS00160   31969   32045   tRNA-Ile        NCIB3610a
NZ_CP020102     TESTGENOMECL_32 31969   32045   tRNA-Ile        TESTGENOME

열 4의 차이로 인해 반환되어야 하는 관련성이 있는 유일한 다른 행은 두 개의 16s 행입니다.

대부분의 경우 줄이 짝을 이루고 있으나 누락된 부분이 있을 수 있습니다.

NZ_CP020102     B4U62_RS00085   20006   20596   pyridoxal 5'-phosphate synthase glutaminase subunit PdxT        NCIB3610a
NZ_CP020102     TESTGENOMECL_17 20006   20596   pyridoxal 5'-phosphate synthase glutaminase subunit PdxT        TESTGENOME
NZ_CP020102     TESTGENOMECL_4554       20704   20925   hypothetical protein    TESTGENOME
NZ_CP020102     B4U62_RS00090   20918   22195   serine--tRNA ligase     NCIB3610a
NZ_CP020102     TESTGENOMECL_18 20918   22195   serine--tRNA ligase     TESTGENOME

이 경우에는 짝이 없는 라인에 관심이 있습니다.

기본적으로 열을 억제하고 diff를 실행한 다음 diff 출력에 억제된 열이 포함되도록 하려고 합니다.

답변1

전제: 이는 실제 솔루션이라기보다는 개념 증명에 더 가깝고, 우아하지 않은 것과 완전히 추악한 것 사이의 어딘가에 위치합니다.

귀하가 무엇을 요구하는지 잘 모르겠습니다. 따라서 제 가정은 다음과 같습니다.

  • 열 하위 집합(1, 3, 4)의 고유한 조합이 있는 모든 행만 선택하려고 합니다. 다른 것에 관심이 있는 경우(예를 들어 두 열의 값이 동일하고 세 번째 열의 값이 다른 몇 개의 행(2개 이상 및 2개 이하)에만 관심이 있는 경우) 질문을 업데이트하여 명확하게 하십시오. .
  • 선택한 행(6개 열 모두)의 전체 내용을 인쇄하려고 합니다.
  • 행의 필드는 공백이 아닌 탭으로 구분됩니다. (그렇지 않으면 다섯 번째 열에 공백 문자가 포함된 것 같기 때문에 약간 이상해집니다.) 메서드는 다양한 필드 구분 기호를 수용해야 합니다.

이 코드에서(두 항목을 모두 your_file실제 파일 이름으로 바꿉니다):

grep -f \
<(sort -k 1b,1b -k 3n,3n -k 4n,4n your_file |
  nl -n rz -w 9 |
  cut -f 1,2,4,5 |
  uniq -f 1 -c |
  grep '^[[:space:]]*1' |
  sed 's/\(^[[:space:]]*1[[:space:]]*\)\(.*\)/^\2/' |
  cut -f 1) \
<(sort -k 1b,1b -k 3n,3n -k 4n,4n your_file |
  nl -n rz -w 9) |
  sed 's/\(^[0-9]\+[[:space:]]*\)\(.*\)/\2/'
  • 귀하의 파일은 1, 3, 4열로 정렬되어 있습니다. (귀하의 질문에서 이미 이 작업을 수행했다고 말씀하셨기 때문에 필요하지 않을 수도 있습니다.)
  • 정렬된 행에는 번호가 매겨져 있습니다. 고정된 9자 길이의 선행 숫자는 0으로 채워집니다.
  • cut비교하려는 트리 필드와 첫 번째 필드(행 번호)만 추출합니다.
  • uniq첫 번째 필드(행 번호)를 무시하고 각 행의 시작 부분에 개수를 추가하여 각 결과 행의 중복 항목을 계산합니다.
  • grep개수가 1인 행만 선택됩니다.
  • sed각 결과 행의 시작 부분에서 개수를 제거합니다.
  • cut줄 번호인 첫 번째 필드만 추출합니다(이 방법은 sed이전 및 시도를 피하는 것보다 쉽습니다 cut -f 2).
  • grep생성된 행 번호 집합을 사용하여 번호가 매겨진 행의 초기 집합을 필터링합니다.
  • 결국 sed필터링된 행 집합에서 선행 행 번호가 제거됩니다.

질문의 14행을 입력으로 사용하면 다음이 제공됩니다.

NZ_CP020102     B4U62_RS00155   30317   31869   16S ribosomal RNA       NCIB3610a
NZ_CP020102     TESTGENOMECL_31 30317   31870   16S ribosomal RNA       TESTGENOME


참고: 다음 을 사용해야 할 수도 있습니다.export LC_ALL=C정렬 문제 방지일부 문자. GNU 도구를 사용하여
Linux에서 테스트되었습니다 .bash

관련 정보