2014-02-25 68 views
0

我有一個問題。我想將兩個文件合併在一起。其中:一起加入兩個文件(AWK)

文件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 

比,從第一個文件ar e在「chr」之後的標記號碼和第二欄中的數字。第二個文件中有相同的標記,但在第二列中有1:10000。我想加入這兩個文件,但對於第一個文件將會有更多的連接行(fe:從第一個文件開始的第一行將是從第二個文件開始的三個行)。 謝謝

+1

你嘗試過這麼遠嗎? StackOverflow用戶很樂意提供幫助,但做功課可能會更困難:) –

+1

星星是真實文件數據的一部分嗎? – Borodin

+0

沒有星星不是真正的文件數據.. – Vonton

回答

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 
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 
+0

@JS웃'%h'是數組的散列,其中鍵是file1的第二列。你可以用'使用Data :: Dumper來檢查它;打印翻斗車\%h'。如果你想學習perl,那麼很少有值得閱讀的書,儘管它們並沒有專注於命令行的使用。 –

+0

@JS웃[有效的Perl編程](http://en.wikipedia.org/wiki/Effective_Perl_Programming)我會說這是關於慣用/禪宗perl(也有第二版的書,但沒有機會看看它) –

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