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