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

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

ファイル1:

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

ファイル2:

a, 2    
f, 9    
g, 3

以下のように、列1に基づいてファイル1とファイル2を組み合わせてファイル3をインポートしたいと思います。

ファイル3:

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

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

答え1

使用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ユーティリティは、両方のデバイスでリレーショナルJOIN操作を実行します。ソート済み入力ファイル。

ここで使用されるフラグは、ユーティリティがコンマ区切りの入力(-t,)を受け入れ、両方のファイル内のすべての項目の出力を生成するように指示します(-a 1 -a 2そうでなければ、一致する最初のフィールドを持つ行の出力のみを生成します)。次に、リンクされたフィールドと2つのファイルの2番目の列()の出力を要求し、不足しているフィールドを文字列(スペースダッシュ、)-o0,1.2,2.2で置き換える必要があることを示します。␣--e ' -'

入力がソートされていない場合は、事前ソートする必要があります。プロセスの置き換えを理解するシェルでは、<( ... )次の方法で実行できます。

join -t, -a 1 -a 2 -o0,1.2,2.2 -e ' -' <( sort file1 ) <( sort file2 )

関連情報