2개 파일의 2개 열에 있는 문자열을 기반으로 행 연결

2개 파일의 2개 열에 있는 문자열을 기반으로 행 연결

Linux 시스템에는 3개의 열이 있는 file1과 4개의 열이 있는 file2가 있습니다. file1의 열 3에 있는 문자열을 기반으로 두 파일을 file2의 열 2에 있는 문자열에 연결하는 방법은 무엇입니까? File2는 항목이 많은 대규모 데이터베이스입니다. file1과 file2의 열 3과 2는 각각 몇 개의 문자열만 공유합니다. 문자열이 일치하는 경우 file1과 연결된 file2 행을 출력하고 일치하지 않는 항목에는 대시를 출력하고 싶습니다.

파일 1:

300 100 a101
450 410 a400
670 710 a20
700 610 a340

파일 2:

b30  a340 tttttttt 456
b500 a200 llllllll 567
b60  a101 uuuuuuuu 344
b40  a50  kkkkkkkk 223

산출:

300 100 a101 b60 a101 uuuuuuuu 344
450 410 a400 -
670 710 a20  -
700 610 a340 b30 a340 tttttttt 456

답변1

Linux의 표준인 GNU awk및 GNU 사용 (GNU가 아닌 버전에서는 작동할 수도 있고 작동하지 않을 수도 있음):join

$ join -a1 -1 3 -2 2 <(sort -k3,3 file1) <(sort -k2,2 file2) | 
    awk '$4 == "" { $4 = "-" }; {t=$1; $1=$2; $2=$3; $3=t; print}' |
    sort
300 100 a101 b60 uuuuuuuu 344
450 410 a400 -
670 710 a20 -
700 610 a340 b30 tttttttt 456

join명령은 각각 필드 3과 2에서 file1과 file2를 연결합니다. 그것은 사용한다프로세스 교체두 파일이 해당 키 필드별로 정렬되어 있는지 확인하세요. 의 행과 일치하지 않더라도 의 모든 행을 인쇄 -a 1하려면 이 옵션을 사용하십시오 .file1file2

불행하게도 joinfile1의 키 필드는 각 레코드의 시작 부분에 배치됩니다. 값의 임시 보유자로 $1이라는 변수를 사용하여 awk필드를 원래 순서로 다시 이동하여 이 문제를 해결하십시오 . t파일 간에 불일치가 있는 경우 awk 스크립트는 $4 필드에 후행 대시 문자도 추가합니다( join자체적으로는 수행하지 않기 때문입니다).

마지막으로 출력이 정렬됩니다.

관련 정보