2つのファイル間の複数の列を一致させる方法は?

2つのファイル間の複数の列を一致させる方法は?

2つのファイルがあり、複数の列の情報を一致させて新しいファイルに出力しようとしています。私は解決策を見つけるのに約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の値を印刷したいと思います。これまでに書いたコードを使用すると、2つのファイルの最初の3列を比較してから4列目にコピーできます。

これまで私が持っているスクリプトの例は次のとおりです。

#! /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つが一致することを確認する方法を探しています。それ以外の場合は、2番目のファイルの元の4番目の列の値をコピーしたいと思います。私は現在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

関連情報