2つのファイルの列をマージし、重複を削除し、不足している行を埋める方法

2つのファイルの列をマージし、重複を削除し、不足している行を埋める方法

マージしたい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 $2a[$1FS$2][0]
  • 2行目はデフォルトでfile2で同じことを行いますが、値を配列に保存しますa[$1FS$2][1]。 awkの配列は次のようになるため、これらの配列割り当て操作は自動的に重複エントリを削除します。関連つまり、各キーは一度だけ表示できることを意味します。
  • 内部の最後のステップでEND各行を印刷し、各NULL値を事前定義された文字列に置き換えます。0 0 0
  • 出力をインデックス値に基づいて昇順に並べ替えるには、PROCINFO["sorted_in"] = "@ind_str_asc"内部の最初の行にaを追加します。END

時間があれば、マニュアルをよく読んでおくと便利です。Gawkプログラミングガイド

おすすめ記事