両方のファイルのすべての列を含む1つのファイルに2つのファイルをマージする必要があります。
サンプルファイルを提供します。 ファイル1
chr loc T1 C1
chr1 100 2 3
chr1 200 3 4
chr2 100 1 4
chr2 400 3 1
ファイル2
chr loc T2 C2
chr1 100 1 2
chr1 300 4 1
chr2 100 7 5
chr2 500 1 9
出力ファイルは次のようにする必要があります
結果ファイル
chr loc T1 C1 T2 C2
chr1 100 2 3 1 2
chr1 200 3 4 0 0
chr1 300 0 0 4 1
chr2 100 1 4 7 5
chr2 400 3 1 0 0
chr2 500 0 0 1 9
答え1
join -a1 -a2 -e 0 -o 0,1.2,1.3,2.2,2.3 \
<(sed 's/ \+/_/' file1 | sort) \
<(sed 's/ \+/_/' file2 | sort) |
sed 's/_/ /' |
column -t |
sort
chr loc T1 C1 T2 C2
chr1 100 2 3 1 2
chr1 200 3 4 0 0
chr1 300 0 0 4 1
chr2 100 1 4 7 5
chr2 400 3 1 0 0
chr2 500 0 0 1 9
sed
ここで最も要求の厳しい部分は、join
単一のフィールドにのみ結合する理由です。ここで結合基準は最初の2つのフィールドです。したがって、これらのフィールドを単語にまとめる必要があります。最初のスペースシーケンスを下線に置き換えて、結合が表示されるようにしますchr1_100
。chr1_200
join
入力ファイルをソートする必要があります。
私は使うプロセスの交換これはjoin
ファイルと同様にパイプでも機能しますsed|sort
。
その後、sed
もう一度呼び出して結合フィールドをキャンセルしてcolumn
素敵にします。
デフォルトでは、join
各ファイルの最初のフィールドがキーフィールドとして使用されます。
デフォルトでjoin
実行するかどうか内部結合:両方のファイルにあるキーのみを印刷します。-a1
オプションを使用すると、必要-a2
な完全な外部接続が可能になります。この-e
オプションは、空のフィールドのデフォルト値を提供します。-o
すべてのフィールドを指定するには、このオプションが必要です。
awkを使用することもできます。
awk '
{key = $1 OFS $2}
NR == FNR {f1[key] = $3; f2[key] = $4; next}
!(key in f1) {print $1, $2, 0, 0, $3, $4; next}
{print key, f1[key], f2[key], $3, $4; delete f1[key]}
END {for (key in f1) print key, f1[key], f2[key], 0, 0}
' file1 file2 | sort
chr loc T1 C1 T2 C2
chr1 100 2 3 1 2
chr1 200 3 4 0 0
chr1 300 0 0 4 1
chr2 100 1 4 7 5
chr2 400 3 1 0 0
chr2 500 0 0 1 9