2012-11-15 4 views
0

이것은 생물 정보학 관련 질문이지만 여전히 많은 프로그래밍 문제입니다. 나는 아래에 주어진 문제에 대해 bash에서 몇 개의 라이너를 구축하지 못했고 여기에 그것을 묻는 것을 생각했다. 친절하게 도와주세요.두 개의 탭으로 구분 된 파일 비교

문제점 : 두 개의 파일 (탭 구분)이 있습니다. 파일 A 모양 같습니다

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

이것은 게놈 좌표 목록입니다.

파일 B에는 첫 번째 3 열에 게놈 좌표가 있고 네 번째 열에는 이름이 있습니다. I는 파일 A와 중첩 정보 파일이

ChrA StrtA stpA ChrB SrtB StpB  Name 

영역처럼 인쇄 된 (제 4 열 함께) 파일 B의 영역을 갖고 싶은

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 

의 영역으로 먼저 올

당신을 감사하는이 파일 B의 네 번째 열의 값과 함께 파일 B에 중복

+5

"ov 얼룩 "? 위의 데이터를 감안할 때 예상되는 결과는 무엇입니까? – Steve

+4

일반적으로이 유형의 질문에는 예제 입력으로 인해 예상되는 결과의 실제 예가 필요합니다. "결과"의 문자열은 입력에 나타나지 않으므로 결과물은 원하는대로 명확한 방법으로 보여주지 않습니다. – kbulgrien

+0

파이썬 경로로 가면 [csv] (http://docs.python.org/library/csv.html) 모듈로 입력 파일을 구문 분석하면 편리하게 사용할 수 있습니다. –

답변

2

확실히 뭔가를 할 pandas보고 추천 이런 식으로. 두 데이터 프레임을 별도의 DataFrames에로드하면 찾고자하는 형식으로 데이터를 병합 할 수 있습니다.

+0

팬더가 겹쳐 보이는가? 나는 당신이 정확한 일치를 가질 필요가 있다고 생각합니다. 여기서 겹치는 것은 내가 믿는이 경우 평등을 의미하지는 않습니다. – petr

+0

@petr : 아니요, 뉴 클레오 티드 내용을 넣을 필요가 없습니다. 순전히 수학적입니다. – user1826775

1

당신은 SQL 틱 방식으로 문제를 처리하기 위해 DBD::CSV을 사용할 수

#!/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; 

(I를 그래도 난 당신의 중복 조건을 이해하는지 모르겠다)