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

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

Linux 시스템에는 3개의 열이 있는 file1과 4개의 열이 있는 file2가 있습니다. file1의 열 3에 있는 문자열을 기반으로 두 파일을 file2의 열 2에 있는 문자열에 어떻게 결합합니까? File2는 항목이 많은 대규모 DB입니다. file1과 file2의 열 3과 2는 각각 소수의 문자열만 공유합니다. 문자열이 일치하는 경우 결합된 file2 행으로 file1을 출력하고 일치하지 않는 항목에 대해 대시를 출력하고 싶습니다.

파일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를 결합합니다. 그것은 사용한다프로세스 대체두 파일이 각각의 키 필드에 따라 정렬되도록 합니다. 이 옵션은 의 라인과 일치하지 않더라도 from의 -a 1모든 라인을 인쇄하도록 사용됩니다 .file1file2

불행하게도 joinfile1의 키 필드는 각 레코드의 시작 부분에 배치됩니다. 이 문제는 $1 값에 대한 임시 보유자라는 awk변수를 사용하여 필드를 원래 순서로 다시 이동하도록 수정되었습니다 . tawk 스크립트는 또한 파일 간에 일치하는 항목이 없으면 $4 필드에 후행 대시 문자를 추가합니다( join자체적으로는 이 작업을 수행하지 않기 때문).

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

관련 정보