ファイル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
関連:
- 質問に対する私の答えgrepを使用して2つのファイルにないテキストを検索する