比较两个制表符分隔的文件

2024-06-26 00:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个与生物信息学相关的问题,但仍然是一个非常重要的编程问题。对于下面给出的问题,我未能在bash中构建一些行程序,因此我想在这里提出这个问题。请帮忙。在

问题:我有两个文件(制表符分开)。文件A看起来像

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

这是基因组坐标的列表。在

文件B的前3列还包含基因组坐标,第4列有一个名称。在

^{pr2}$

我想要的是文件B的区域(以及第四列)与文件A重叠并打印成这样

ChrA   StrtA    stpA    ChrB  SrtB  StpB       Name 

首先是文件A中的区域,然后是文件B中与其重叠的区域以及文件B中第四列的值

谢谢你


Tags: 文件程序名称bash区域基因组列表编程
3条回答

可以使用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;

(不过,我不确定我是否理解您的重叠条件)

我绝对建议您使用pandas来执行类似的操作。将两者都加载到单独的数据帧中,然后您应该能够以您希望看到的格式将它们合并在一起。在

相关问题 更多 >