共通列に基づいてタブで区切られた複数のテーブルのマージ

共通列に基づいてタブで区切られた複数のテーブルのマージ

私はこの分野に慣れておらず、それぞれ2つの列(「Position」と「Poly」)のタブで区切られた50000個のファイルを比較してマージしたいと思います。 file1とfile2(および他のファイル)の例と私が探している最終出力は次のとおりです。

ファイル1:

位置ポリ
100001℃
228201T
341791T
380441C
392640トン
459055A
459079 電話
480253T
570405トン
492633A

ファイル2:

位置ポリ
100001℃
312002C
341791T
380441C
412640A
459055A
459079 電話
464056T
570405トン
492633A

出力:

場所ファイル1ファイル2
100001CC
228201ティー
312002-C
341791TT
380441CC
392640ティー-
412640-A
459055AA
459079電信送金送金
480253ティー-
464056-T
570405TT
492633AA

基本的に私はそれらを単一の行列に変換し、ファイルに場所がない場合はダッシュを追加したいと思います。

ベストアンサー1

joinGNU関数coreutilsほぼ何をしたいですか - 両方のファイルが同時に欠落している現象を処理する方法が見つかりませんが、

sort -u \
<(join --header --nocheck-order -t$'\t' -a1 -o 1.1,1.2,2.2 -11 -21 -e'-' file1 file2) \ 
<(join --header --nocheck-order -t$'\t' -a2 -o 2.1,1.2,2.2 -11 -21 -e'-' file1 file2)
100001  C       C
228201  T       -
312002  -       C
341791  T       T
380441  C       C
392640  T       -
412640  -       A
459055  A       A
459079  T       T
464056  -       T
480253  T       -
492633  A       A
570405  T       T
Position        Poly    Poly

ヘッダー行は一番下に並べられます。これが問題の場合は、パイプsed '$d'または削除できますhead -n -1。あるいは、ソートされていない出力が許可されている場合は、ieの代わりに重複するawkエントリsort -uを削除することもできます。

awk '!a[$1]++' \
<(join --header --nocheck-order -t$'\t' -a1 -o 1.1,1.2,2.2 -11 -21 -e'-' file1 file2) \
<(join --header --nocheck-order -t$'\t' -a2 -o 2.1,1.2,2.2 -11 -21 -e'-' file1 file2)
Position        Poly    Poly
100001  C       C
228201  T       -
341791  T       T
380441  C       C
392640  T       -
459055  A       A
459079  T       T
480253  T       -
570405  T       T
492633  A       A
312002  -       C
412640  -       A
464056  -       T

おすすめ記事