共通列に基づいて2つのファイルをマージします。

共通列に基づいて2つのファイルをマージします。

2つのファイルがあります。ファイル1は次のようになります。

chr19   4124051 4124250 1
chrX    154458151   154458200   2
chr22   37019451    37019600    3
chr15   74995401    74995550    4
chr12   128823901   128824100   5

ファイル2は次のようになります。

chr19   4124051 4124250 1   CUP
chr15   74995401    74995550    4   CUP
chr12   128823901   128824100   5   CUP
chr12   122752651   122752950   8   CUP
chr13   113297001   113297350   9   CUP

私は次のようなFile3が欲しい。

chr19   4124051 4124250 1 CUP
chrX    154458151   154458200   2
chr22   37019451    37019600    3
chr15   74995401    74995550    4 CUP
chr12   128823901   128824100   5 CUP

File1の列4に基づいて2つのファイルをマージして一致する場合は、File2の列5の値をFile1の最後の列に追加したいと思います。

私はこれに疲れました。

awk 'FNR==NR{a[$4]=$5;next} {print $1,$2,$3,$4,a[$4]}' File2 File1 > file3

しかし、うまくいきません。各行の下に追加の行を作成します。

私もJoinコマンドを試しました。

join -1 4 -2 4 -o'1.1,1.2,1.3,1.4,2.5' File1 File2

空のファイルが生成されます。

どんな提案がありますか?

ベストアンサー1

ファイルはWindowsで作成されたため、Windowsスタイルの行末(\r\n)があります。削除\rすると、すべてが期待どおりに機能します。

sed -i 's/\r//' File1
sed -i 's/\r//' File2
awk 'FNR==NR{a[$4]=$5;next} {print $1,$2,$3,$4,a[$4]}' File2 File1 > file3

おすすめ記事