web-dev-qa-db-ja.com

列に基づいて2つのファイルを結合する

file1:

a, 1    
b, 5    
c, 2    
f, 7

file2:

a, 2    
f, 9    
g, 3

以下のように、列1に基づいてファイル1とファイル2を結合し、ファイル3を取得します。

file3:

a, 1, 2    
b, 5, -    
c, 2, -    
f, 7, 9    
g, -, 3

一致する値をマージし、各ファイルから特定の値を保持する

4
chris

joinの使用:

_$ join -t, -a 1 -a 2 -o0,1.2,2.2 -e ' -' file1 file2
a, 1, 2
b, 5, -
c, 2, -
f, 7, 9
g, -, 3
_

標準のjoinユーティリティは、2つのsorted入力ファイルに対してリレーショナルJOIN操作を実行します。

ここで使用されるフラグは、ユーティリティにカンマ区切りの入力(_-t,_)を期待し、両方のファイルのすべてのエントリの出力を生成するように指示します(_-a 1 -a 2_、それ以外の場合、一致する最初のフィールドを持つ行の出力のみを生成します) 。次に、結合フィールドと両方のファイルの2番目の列(_-o0,1.2,2.2_)の出力を要求し、欠落しているフィールドは文字列_␣-_(スペースダッシュ、_-e ' -'_)。

入力がソートされていない場合は、事前にソートする必要があります。 <( ... )によるプロセス置換を理解するシェルでは、これは

_join -t, -a 1 -a 2 -o0,1.2,2.2 -e ' -' <( sort file1 ) <( sort file2 )
_
6
Kusalananda