web-dev-qa-db-ja.com

共通の列に従って2つのファイルをマージする

2つのファイルがあります。 File1は次のとおりです。

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

そしてFile2は:

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からFile1の最後の列に列5の値を追加します。

私はこれに疲れました:

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

空のファイルを作成します。

助言がありますか?

3
Chiara

ファイルは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
2
terdon

join + sortソリューション:

join -j4 -a1 -o1.1,1.2,1.3,1.4,2.5 <(sort -k4 File1) <(sort -k4 File2) | column -t

出力:

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

  • -j4-4列目で結合

  • -a1-最初のファイルからペアにできない行を出力します

  • sort -k4 File1-4番目の列/キー(-k4

1
RomanPerekhrest
Perl -F'\s+' -lane '
   s/\r$//; my $i = join $;, @F[0,3];
   @ARGV and $h{$i} = $F[4],next;
   print exists $h{$i} ? s/$/ $h{$i}/r : $_;
' File2 File1

与える:

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