![2개 파일의 2개 열에 있는 문자열을 기반으로 행 연결](https://linux55.com/image/191581/2%EA%B0%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%98%202%EA%B0%9C%20%EC%97%B4%EC%97%90%20%EC%9E%88%EB%8A%94%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EA%B8%B0%EB%B0%98%EC%9C%BC%EB%A1%9C%20%ED%96%89%20%EC%97%B0%EA%B2%B0.png)
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
하려면 이 옵션을 사용하십시오 .file1
file2
불행하게도 join
file1의 키 필드는 각 레코드의 시작 부분에 배치됩니다. 값의 임시 보유자로 $1이라는 변수를 사용하여 awk
필드를 원래 순서로 다시 이동하여 이 문제를 해결하십시오 . t
파일 간에 불일치가 있는 경우 awk 스크립트는 $4 필드에 후행 대시 문자도 추가합니다( join
자체적으로는 수행하지 않기 때문입니다).
마지막으로 출력이 정렬됩니다.