2つのファイルがあり、最初のファイルの列1が他のファイルの列1の値と一致する場合は、値を追加して新しいファイルに書き込みます。

2つのファイルがあり、最初のファイルの列1が他のファイルの列1の値と一致する場合は、値を追加して新しいファイルに書き込みます。

ファイル1

Name    marks
sagat    20
raji     30
kamal    56
sanj     10

ファイル2

Name    marks
sagat    20
kamal    56
Jagan    30
suraj    90
sanj     78

出力ファイル1(共通名)

Name    marks
sagat    40
kamal    112
sanj     88

出力ファイル2

Name    marks
raji     30
Jagan    30
suraj    90

ベストアンサー1

シェルがプロセス置換(たとえばbash)をサポートしているとします。

$ join <( sort file1 ) <( sort file2 ) | awk 'BEGIN { OFS="\t"; print "Name", "Marks" } !/^Name/ { print $1, $2 + $3 }'
Name    Marks
kamal   112
sagat   40
sanj    88

このjoinコマンドは、最初の列(名前)にある2つの(ソートされた)ファイルをリンクし、表示される内容を出力します。両方ファイルと各ファイルのタグを2番目と3番目の列として表示します。この3列データは、awkヘッダーを出力してから2番目と3番目の列の名前と合計を印刷する短いプログラムに供給されます(前のNameヘッダーで始まる行は処理されません)。

$ join -v1 -v2 <( sort file1 ) <( sort file2 ) | awk 'BEGIN { OFS="\t"; print "Name", "Marks" } !/^Name/ { print $1, $2 + $3 }'
Name    Marks
Jagan   30
raji    30
suraj   90

これは同様の操作を実行しますが、joinファイルタグを2番目の列として使用して2つのファイルの識別名を出力します。簡単にするために、awk手順は同じですが、3番目の列がないため、ここでは$2 + $3短縮できます。$2

関連:

おすすめ記事