我有一个问题。我想将两个文件合并在一起。其中:
文件1:
chr**1 10000** rs200132 A C 100.000
chr**2 20000** rs5000 C G 80.000
文件2:
rs200132 **1:10000** A 800 200 Nmf
rs210111 **1:10000** G 200 800 VFC
rs310000 **1:10000** C 100 500 tff
rs50001 **2:20000** T 500 100 jpp
rs60000 **2:20000** A 1000 10 jkl
输出:
chr**1 10000** rs200132 A A C 800 200 Nmf
chr**1 10000** rs210111 G A C 200 800 VFC
chr**1 10000** rs310000 C A C 100 500 tff
chr**2 20000** rs50001 T C G 500 100 jpp
chr**2 20000** rs60000 A C G 1000 10 jkl
从第一个文件开始,是“chr”之后的标记号,第二列是数字。相同的标记在第二个文件中,但在第二列中有1:10000。我想加入这两个文件但是对于第一个文件将会有更多的连接行(f.e。:第一个文件的第一行将是第二个文件的三行。) 谢谢
答案 0 :(得分:4)
perl -lane'
BEGIN{ $x=pop; %h = map{ $_->[1] => $_ } map [split], <>; @ARGV=$x }
$F[1] =~ s/.+?://;
$t = $h{$F[1]};
print join " ", @$t[0,1], @F[0,2], @$t[3,4], @F[3..5];
' file1 file2
输出
chr**1 10000** rs200132 A A C 800 200 Nmf
chr**1 10000** rs210111 G A C 200 800 VFC
chr**1 10000** rs310000 C A C 100 500 tff
chr**2 20000** rs50001 T C G 500 100 jpp
chr**2 20000** rs60000 A C G 1000 10 jkl
答案 1 :(得分:3)
您可以使用此awk
,
awk 'NR==FNR{a[$2]=$1;b[$2]=$4" "$5;next} {sub(/.*:/,"",$2); $3=$1" "$3" "b[$2]; $1=a[$2];}1' file1 file2
<强>测试强>
sat:~# awk 'NR==FNR{a[$2]=$1;b[$2]=$4" "$5;next} {sub(/.*:/,"",$2); $3=$1" "$3" "b[$2]; $1=a[$2];}1' file1 file2
chr**1 10000** rs200132 A A C 800 200 Nmf
chr**1 10000** rs210111 G A C 200 800 VFC
chr**1 10000** rs310000 C A C 100 500 tff
chr**2 20000** rs50001 T C G 500 100 jpp
chr**2 20000** rs60000 A C G 1000 10 jkl
答案 2 :(得分:0)
这是使用Perl的另一种方式:
perl -lane '
if (@ARGV) {
($x = $F[0]) =~ s/[^\d]*//;
$h{$x}{$F[1]} = [ @F[0,1,3,4] ]
}
else {
@t = split(":", $F[1]);
$r = $h{$t[0]}{$t[1]};
print join(" ", @$r[0,1], @F[0,2], @$r[2,3], @F[3..5])
}
' file1 file2 | column -t
结果:
chr1 10000 rs200132 A A C 800 200 Nmf
chr1 10000 rs210111 G A C 200 800 VFC
chr1 10000 rs310000 C A C 100 500 tff
chr2 20000 rs50001 T C G 500 100 jpp
chr2 20000 rs60000 A C G 1000 10 jkl