这是生物信息学相关的问题,但仍然是一个非常多的编程问题。我没有在bash中建立一些衬垫来解决下面给出的问题,并想在这里问一下。请帮助。
问题:我有两个文件(标签分隔)。文件A看起来像
chr1 17050255 234916798
chr1 36688211 36840408
chr1 153961765 154156955
chr1 154128722 154194653
chr1 154130378 154156872
chr1 207493679 207819735
这是基因组坐标列表。
文件B在前3列中也包含基因组坐标,在第4列中包含名称。
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的区域(以及第四列)与文件A重叠并像这样打印
ChrA StrtA stpA ChrB SrtB StpB Name
文件A中的区域首先出现在文件B中与文件B重叠的区域以及文件B中第四列的值。
谢谢
答案 0 :(得分:2)
我绝对建议pandas做这样的事情。将它们加载到单独的DataFrame中,然后您应该能够以您希望看到的格式将它们合并在一起。
答案 1 :(得分:2)
使用 bedtools intersectBed:http://code.google.com/p/bedtools/wiki/Usage#intersectBed
(你也可以问http://www.biostars.org/)
答案 2 :(得分:1)
您可以使用DBD::CSV以SQL-ish方式处理您的问题:
#!/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;
(我不确定我是否理解你的重叠情况)