ID가 일치할 때 다른 파일의 열을 복사하는 방법

ID가 일치할 때 다른 파일의 열을 복사하는 방법

파일이 2개 있는데,

head file1

    1   115258827   12 HG00099
    1   115258827   5 HG00100
    1   115258827   8 HG00101
    1   115258827   6 HG00103
    1   115258827   4 HG00108
    1   115258827   3 HG00110
    1   115258827   4 HG00111
    1   115258827   2 HG00114
    1   115258827   8 HG00115
    1   115258827   5 HG00116

그리고 또 다른 파일

head file2
HG00096 0|0
HG00097 0|0
HG00099 0|0
HG00100 0|1
HG00101 0|0
HG00102 0|0
HG00103 0|0
HG00105 0|0
HG00106 0|0
HG00107 0|0

file1의 마지막 열이 file2의 첫 번째 열과 일치하는지 확인하고, file2의 두 번째 열을 file1에 추가하고 다음과 같이 끝나기를 원합니다.

head desired
1   115258827   12 HG00099 0|0
1   115258827   5 HG00100  0|1
1   115258827   8 HG00101  0|0
1   115258827   6 HG00103  0|0

답변1

데이터를 병합/결합하려는 필드가 정렬되어 있다고 가정합니다.

$ join -1 4 -o1.1,1.2,1.3,0,2.2 file1 file2
1 115258827 12 HG00099 0|0
1 115258827 5 HG00100 0|1
1 115258827 8 HG00101 0|0
1 115258827 6 HG00103 0|0

그러면 네 번째 열( 파일의 첫 번째 열이 아니기 때문에 file1지정됨 )과 첫 번째 열(파일을 정렬해야 하는 열) 의 두 파일이 결합됩니다 .-1 4file2

-o플래그는 join출력에서 ​​보고 싶은 필드와 해당 필드를 가져올 파일을 알려줍니다( 1.3예: "첫 번째 파일의 세 번째 필드", 0조인 필드를 의미).

사용의 장점 join은 두 파일 모두 메모리로 완전히 읽을 필요가 없다는 것입니다.


파일이 정렬되지 않은 경우 다음 방법을 사용하여 파일을 한 번에 모두 사전 정렬할 수 있습니다.

sort -k4 -o file1 file1
sort     -o file2 file2

또는 프로세스 대체를 이해하는 쉘을 사용하는 경우 다음을 사용하여 조인하는 동안 정렬할 수 있습니다.

join -1 4 -o1.1,1.2,1.3,0,2.2 <( sort -k4 file1 ) <( sort file2 )

정렬된 데이터는 join한 번에 각 파일의 몇 행만 메모리에 저장할 수 있습니다.

답변2

노력하다:

awk 'FNR==NR{seen[$1]=$2; next} seen[$NF]{print $0, seen[$NF]}' file2 file1

$1 열의 키를 사용하여 $2 열의 해당 값을 다음과 같은 연관 배열에 저장합니다.언제읽기 전용파일 2여기서 NR==FNR(읽을 입력 파일이 여러 개인 경우 첫 번째 입력 파일에 대해 항상 true)는 NR첫 번째 레코드/라인 읽기에서 1로 설정됩니다.단일 입력 파일 또는 여러 파일의 모든 레코드/라인을 읽을 때까지 증가하며 FNR첫 번째 레코드/라인 읽기에서 1로 설정됩니다.현재 입력 파일에서 모든 레코드/라인을 읽을 때까지 증가하고 다음 파일에서 다시 1로 재설정됩니다.

마지막 열의 값이 표시된 배열의 동일한 키 값과 일치하면 다음 블록은 전체 줄을 인쇄합니다.파일 1그리고 배열에 있는 동일한 키의 값입니다.

관련 정보