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
空のファイルを作成します。
助言がありますか?
ファイルは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
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
)
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