マージしたい2つの別々のファイルがあります。それぞれ7つの列があります。
1 10 6 0.02 A 45 0.17
1 15 6 0.03 A 67 0.17
2 33 6 0.10 A 23 0.17
そして
1 10 6 0.04 B 87 0.17
1 12 6 0.12 B 93 0.17
2 33 6 0.08 B 45 0.17
重複エントリを削除しながら、各ファイルの列1と列2をマージしてから、各ファイルの列4 5 6を列1と列2の対応する組み合わせに追加したいと思います。次に、列1と2が一致しない場合は、欠落しているファイルに印刷し、列4、5、6の代わりに0を入力して最終ファイル
1 10 0.02 A 45 0.04 B 87
1 12 0 0 0 0.12 B 93
1 15 0.03 A 67 0 0 0
2 33 0.10 A 23 0.08 B 45
ベストアンサー1
簡単な方法は、awkで2D配列を使用することです。
FNR==NR {a[$1FS$2][0]=$4FS$5FS$6; next}
{a[$1FS$2][1]=$4FS$5FS$6}
END {
empty="0"FS"0"FS"0"
for(i in a)
print i FS (a[i][0]? a[i][0] : empty) FS (a[i][1]? a[i][1] : empty)
}
スクリプトをファイルとして保存して実行できます。
awk -f main.awk file1 file2
説明する
- 最初の行はfile1をスキャンし、関連キーとともに必要な列
FNR==NR
を配列に保存します。$4 $5 $6
$1 $2
a[$1FS$2][0]
- 2行目はデフォルトでfile2で同じことを行いますが、値を配列に保存します
a[$1FS$2][1]
。 awkの配列は次のようになるため、これらの配列割り当て操作は自動的に重複エントリを削除します。関連つまり、各キーは一度だけ表示できることを意味します。 - 内部の最後のステップで
END
各行を印刷し、各NULL値を事前定義された文字列に置き換えます。0 0 0
- 出力をインデックス値に基づいて昇順に並べ替えるには、
PROCINFO["sorted_in"] = "@ind_str_asc"
内部の最初の行にaを追加します。END
時間があれば、マニュアルをよく読んでおくと便利です。Gawkプログラミングガイド