次の2つのファイルをマージする必要があります。
- ファイル1:
表 REF-IO HEAD-IO DIFF-IO
テスト 200500 -300
テスト 2 3 -1
最終 2 1 1
メール 4 2 2
合計 208506 -298
- ファイル2:
表参照選択ヘッド選択比較選択
テスト5 7 -2
競争3 3 0テスト
0 7 -7
最終12 6 6
合計20 23 -3
マージされたファイルは次のようになります。
テーブル REF-IO HEAD-IO DIFF-IO REF-SELECT HEAD-SELECT DIFF-SELECT
テスト 200500 -300 5 7 -2
テスト 2 3 -1 0 7 -7
最終 2 1 1 12 6 6
メール 4 2 2 0 0 0合計
208 506 -298 20 23 -3
答え1
awk '
NR==FNR {vals[$1] = $2 " " $3 " " $4; next}
!($1 in vals) {vals[$1] = "0 0 0"}
{$(NF+1) = vals[$1]; print}
' file2 file1
TABLES REF-IO HEAD-IO DIFF-IO REF-SELECT HEAD-SELECT DIFF-SELECT
test 200 500 -300 5 7 -2
exam 2 3 -1 0 7 -7
final 2 1 1 12 6 6
mail 4 2 2 0 0 0
TOTAL 208 506 -298 20 23 -3
答え2
join
行の順序、ヘッダー、フッターなどを使用して保存する方法は次のとおりです。
join -1 2 -2 1 -a 1 -e 0 -o 1.1,1.2,1.3,1.4,1.5,2.2,2.3,2.4 \
<(sort -k2,2 <(nl -ba -nrz file1)) <(sort -k1,1 file2) | \
sort -k1,1n | cut -d\ -f2-
結果:
TABLES REF-IO HEAD-IO DIFF-IO REF-SELECT HEAD-SELECT DIFF-SELECT
test 200 500 -300 5 7 -2
exam 2 3 -1 0 7 -7
final 2 1 1 12 6 6
mail 4 2 2 0 0 0
TOTAL 208 506 -298 20 23 -3
仕組み:
nl -ba -nrz file1
行に番号を付け、file1
出力sort
を2番目のフィールドに追加します。file2
またsort
、最初のフィールドを編集し、結果をjoin
最初の入力の2番目のフィールドと2番目の入力の1番目のフィールドに追加し、不足している入力フィールドを次に置き換えます0
。
000003 exam 2 3 -1 0 7 -7
000004 final 2 1 1 12 6 6
000005 mail 4 2 2 0 0 0
000001 TABLES REF-IO HEAD-IO DIFF-IO REF-SELECT HEAD-SELECT DIFF-SELECT
000002 test 200 500 -300 5 7 -2
000006 TOTAL 208 506 -298 20 23 -3
次に、最初のフィールドをソートしてsort -k1,1n
行の順序を復元し、cut -d\ -f2-
行番号を削除します。たとえば、次のようにしてcolumn
より美しくすることができます.... | column -t
。
TABLES REF-IO HEAD-IO DIFF-IO REF-SELECT HEAD-SELECT DIFF-SELECT
test 200 500 -300 5 7 -2
exam 2 3 -1 0 7 -7
final 2 1 1 12 6 6
mail 4 2 2 0 0 0
TOTAL 208 506 -298 20 23 -3
答え3
このスクリプトは次のように動作するはずです。
touch resultFile
while read f; do
header1=$(echo $f | awk '{print $1;}');
values1=$(echo $f | awk -F "$header1 " '{print $NF;}');
while read g; do
header2=$(echo $g | awk '{print $1;}');
values2=$(echo $g | awk -F "$header2 " '{print $NF;}');
if [ $header1 = $header2 ]; then
echo "$header1 $values1 $values2" >> resultFile
fi
done < file2
done < file1
ヘッダーは一意でなければなりません。それ以外の場合は、見つかった最後の行のみがマージされます。
PS:「Mail」ヘッダーは「Game」のため、両方のファイルにないため、結果にはならないと思います(あなたの例では「Mail」はありますが、「Game」はありません)。
答え4
気になるなら、はいjoin
行の順序は維持されませんが、次を使用してこれを実行できます。
(
join <(head -n1 file1) <(head -n1 file2)
join -a 1 -e 0 -o '0 1.2 1.3 1.4 2.2 2.3 2.4' \
<(sed -n 2,5p file1 | sort) \
<(sed -n 2,5p file2 | sort)
join <(tail -n1 file1) <(tail -n1 file2)
)
出力:
TABLES REF-IO HEAD-IO DIFF-IO REF-SELECT HEAD-SELECT DIFF-SELECT
exam 2 3 -1 0 7 -7
final 2 1 1 12 6 6
mail 4 2 2 0 0 0
test 200 500 -300 5 7 -2
TOTAL 208 506 -298 20 23 -3