두 파일 사이의 여러 열을 일치시키는 방법은 무엇입니까?

두 파일 사이의 여러 열을 일치시키는 방법은 무엇입니까?

두 개의 파일이 있고 여러 열의 정보를 일치시켜 새 파일로 출력하려고 합니다. 나는 해결책을 찾는 데 약 80% 정도 도움이 된 여러 기사를 찾았으며 퍼즐의 마지막 조각에 대한 도움을 찾고 있습니다. 현재 사용하고 있는 시스템은 Solaris Unix 시스템이며, 대부분의 정보 작업을 완료하기 위해 주로 ksh 쉘을 사용합니다. 내가 얻은 해결책은 awk 명령을 사용하는 것입니다. 테이블은 현재 공백으로 구분된 4개의 열로 나누어져 있습니다. 파일 1은 제가 보관하고 있는 마스터 파일 목록의 예이며 파일 2와 비교합니다.

파일 1은 다음과 같습니다(마스터 파일 목록).

FOO1 BAR1 100 SX2000  
FOO1 BAR1 101 SX2001  
FOO1 BAR1 102 SX2002  
FOO1 BAR1 103 SX2003  
FOO1 BAR1 104 SX2004  
FOO1 BAR1 105 SX2005  
FOO1 BAR1 106 SX2006  
FOO1 BAR1 107 SX2007  
FOO1 BAR1 108 SX2008  
FOO1 BAR1 109 SX2009  
FOO1 BAR1 110 SX2010  
FOO1 BAR1 111 SX2011  
FOO1 BAR1 112 SX2012  
FOO1 BAR1 113 SX2013  
FOO1 BAR1 114 SX2014  
FOO1 BAR1 115 SX2015  
FOO1 BAR1 116 SX2016  
FOO1 BAR1 117 SX2017  
FOO1 BAR1 118 SX2018  
FOO1 BAR1 119 SX2019  
FOO1 BAR1 120 SX2020  

파일 2는 다음과 같습니다(제가 작성 중인 표).

FOO1 BAR1 100 SX  
FOO1 BAR1 101 SX  
FOO1 BAR1 102 SX  
FOO1 BAR1 103 SX  
FOO1 BAR1 104 SX  
FOO1 BAR1 105 NV  
FOO1 BAR1 106 SX  
FOO1 BAR1 107 SX  
FOO1 BAR1 108 SX  
FOO1 BAR1 109 SX  
FOO1 BAR1 113 SX  
FOO1 BAR1 114 SX  
FOO1 BAR1 115 NV  
FOO1 BAR1 116 SX  
FOO1 BAR1 117 SX  
FOO1 BAR1 118 SX  
FOO1 BAR1 119 SX  

내가 원하는 결과는 다음과 같습니다.

FOO1 BAR1 100 SX2000  
FOO1 BAR1 101 SX2001  
FOO1 BAR1 102 SX2002  
FOO1 BAR1 103 SX2003  
FOO1 BAR1 104 SX2004  
FOO1 BAR1 105 NV  
FOO1 BAR1 106 SX2006  
FOO1 BAR1 107 SX2007  
FOO1 BAR1 108 SX2008  
FOO1 BAR1 109 SX2009  
FOO1 BAR1 113 SX2013  
FOO1 BAR1 114 SX2014  
FOO1 BAR1 115 NV  
FOO1 BAR1 116 SX2016  
FOO1 BAR1 117 SX2017  
FOO1 BAR1 118 SX2018  
FOO1 BAR1 119 SX2019  

보시다시피 파일 2를 파일 1과 비교하고 정확히 일치하는 항목이 있으면 4열의 값을 인쇄하고 싶습니다. 지금까지 작성한 코드를 사용하면 두 파일의 처음 3개 열을 비교한 다음 네 번째 열에 복사할 수 있습니다.

지금까지 내가 가지고 있는 스크립트의 예는 다음과 같습니다.

#! /bin/ksh

file1=master_table
file2=test_table
file3=combined_table

awk -F' ' '(FNR==NR) {a[$1,$2,$3]=$4; next} (($1,$2,$3) in a) {print $1,$2,$3,a[$1,$2,$3]}' $file1 $file2 > $file3

정보를 복사하기 전에 처음 3개 열과 비교하고 열 4의 처음 2자가 일치하는지 확인하는 방법을 찾고 있습니다. 그렇지 않으면 두 번째 파일의 원래 네 번째 열 값을 복사하고 싶습니다. 현재 awk를 사용하고 있지만 이것이 반드시 최종 솔루션은 아닙니다. 파일로 다른 작업을 더 쉽게 수행할 수 있도록 쉘 스크립트에 보관하고 싶습니다.

당신의 도움에 미리 감사드립니다! !

답변1

$ cat tst.awk
{ key = $1 FS $2 FS $3 FS substr($4,1,2) }
NR==FNR { a[key]=$4; next }
key in a { $4=a[key] }
{ print }

.

$ awk -f tst.awk file1 file2
FOO1 BAR1 100 SX2000
FOO1 BAR1 101 SX2001
FOO1 BAR1 102 SX2002
FOO1 BAR1 103 SX2003
FOO1 BAR1 104 SX2004
FOO1 BAR1 105 NV
FOO1 BAR1 106 SX2006
FOO1 BAR1 107 SX2007
FOO1 BAR1 108 SX2008
FOO1 BAR1 109 SX2009
FOO1 BAR1 113 SX2013
FOO1 BAR1 114 SX2014
FOO1 BAR1 115 NV
FOO1 BAR1 116 SX2016
FOO1 BAR1 117 SX2017
FOO1 BAR1 118 SX2018
FOO1 BAR1 119 SX2019

관련 정보