2012-11-15 50 views
0

這是生物信息學相關的問題,但仍然是一個非常多的編程問題。對於下面給出的問題,我沒有在bash中建立一些內容,並想到在這裏提問。請幫助。比較兩個製表符分隔的文件

問題:我有兩個文件(製表符分隔)。文件A看起來像

chr1 17050255 234916798 
chr1 36688211 36840408 
chr1 153961765 154156955 
chr1 154128722 154194653 
chr1 154130378 154156872 
chr1 207493679 207819735 

這是一個基因組座標列表。

文件B在其前3列中也包含基因組座標,第四列中包含它的名稱。

chr1 1709155 1709324 MMM3 
chr1 1709155 1709324 Sk-20 
chr1 1709608 1709727 ZdaA 
chr1 1709608 1709727 ZdaA 
chr1 1709608 1709727 ZA 
chr1 1709629 1709727 E-1 
chr1 1709629 1709727 E-1 
chr1 1709629 1709727 E-1 

我想要什麼與文件中的重疊,打印像文件中的這個

ChrA StrtA stpA ChrB SrtB StpB  Name 

地區(連同第四列)有文件B的區域是第一位的,然後該地區擁有它在文件B與第四列的文件B.值一起重疊

謝謝

+5

你如何定義「ov erlap「?鑑於上述數據,您的預期產出是什麼? – Steve

+4

這種類型的問題通常需要示例輸入產生的預期輸出的實際示例。 「結果」的字符串不會出現在輸入中,因此輸出不會以清晰的方式顯示您想要的內容。 – kbulgrien

+0

如果您使用Python路徑,使用[csv](http://docs.python.org/library/csv.html)模塊解析輸入文件可能會讓您的生活更輕鬆。 –

回答

2

我絕對推薦看pandas做事端像這樣。加載到單獨的DataFrame中,然後你應該能夠以你希望看到的格式合併它們。

+0

熊貓是否會查找重疊?我認爲你需要有完全匹配,這裏的重疊並不意味着我相信在這種情況下的平等。 – petr

+0

@petr:不,你不必把核苷酸的內容。這純粹是數學的。 – user1826775

1

你可以使用DBD::CSV來處理一個SQL上下的方式你的問題:

#!/usr/bin/env perl 
use strict; 
use utf8; 
use warnings 'all'; 

use Data::Printer; 
use DBI; 

my $dbh = DBI->connect('dbi:CSV:', undef, undef, { 
    f_encoding  => 'utf8', 
    csv_quote_char => undef, 
    csv_escape_char => undef, 
    csv_sep_char => "\t", 
    csv_eol   => "\n", 
    csv_quote_space => 0, 
    csv_quote_null => 0, 
    csv_tables  => { 
     fileA  => { file => 'fileA.tsv' }, 
     fileB  => { file => 'fileB.tsv' }, 
    }, 
    RaiseError  => 1, 
    PrintError  => 1, 
}) or die "DBI/DBD::CSV error: " . $DBI::errstr; 

my $sth = $dbh->prepare(<<SQL_QUERY); 
    SELECT * 
    FROM fileA 
    JOIN fileB ON 
     (StrtA <= StpB) OR (StrtB <= StpA) 
    WHERE Name IS NOT NULL 
SQL_QUERY 

$sth->execute; 
while (my $row = $sth->fetchrow_arrayref) { 
    p $row; 
} 
$sth->finish; 
$dbh->disconnect; 

(我不知道我是否理解你的重疊條件,但)