一起加入两个文件(AWK)

时间:2014-02-25 13:14:04

标签: perl awk merge

我有一个问题。我想将两个文件合并在一起。其中:

文件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。:第一个文件的第一行将是第二个文件的三行。) 谢谢

3 个答案:

答案 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