문자와 숫자를 사용하여 정렬 및 연결

문자와 숫자를 사용하여 정렬 및 연결

두 개의 파일(file1과 file2)이 있고 두 파일에 없는 열이 포함된 세 번째 파일(file3)을 설치하려고 합니다. 저는 보통 정렬을 먼저 하고 합류를 합니다. 하지만 다음 예와 같이 해당 값에 문자와 숫자가 포함되어 있으므로 작동하지 않습니다.

파일 1:

ARS-BFGL-BAC-1180 14 20574088
ARS-BFGL-BAC-11805 12 14897445
ARS-BFGL-BAC-11852 1 34309921
ARS-BFGL-BAC-11867 13 12616676 

파일 2

AC16359 ARS-BFGL-BAC-11798 B B
AC16359 ARS-BFGL-BAC-11805 B B
AC16359 ARS-BFGL-BAC-1180 B B
AC16359 ARS-BFGL-BAC-11852 A A
AC16359 ARS-BFGL-BAC-11867 B B 

나는 두 가지 모두에 대해 동일한 정렬 명령을 사용했으며 최종 SNP_Name 11805가 1180보다 높은 반면 다른 하나는 그렇지 않다는 것을 알았습니다.

답변1

일치하는 필드로만 정렬합니다(예: file1의 경우 -k1,1, file2의 경우 -k2,2).

예를 들어

$ join -1 1 -2 2  <(sort -k1,1 file1) <(sort -k2,2 file2) 
ARS-BFGL-BAC-1180 14 20574088 AC16359 B B
ARS-BFGL-BAC-11805 12 14897445 AC16359 B B
ARS-BFGL-BAC-11852 1 34309921 AC16359 A A
ARS-BFGL-BAC-11867 13 12616676 AC16359 B B

처음에는 버전 정렬만 사용해 보았습니다( -V비표준 --version-sort옵션이며 GNU 또는 *BSD 정렬이 필요함). 이는 및 의 유무에 관계없이 작동 -k1,1하지만 -k2,2더 크거나 다른 데이터 파일 세트에서는 안정적으로 작동하지 않을 수 있습니다.

키 필드에 4자리 또는 5자리(및 더 많은 변형 가능)가 포함될 수 있다는 점을 고려하여 다음을 사용하세요.자연스러운 순서이상적입니다. 그래서 버전 정렬을 사용하겠습니다.그리고키 필드를 지정합니다.

join -1 1 -2 2  <(sort -V -k1,1 file1) <(sort -V -k2,2 file2)

관련 정보