Python 比较两个选项卡分隔的文件
这是一个与生物信息学相关的问题,但仍然是一个非常重要的编程问题。对于下面给出的问题,我没有在bash中构建一些行程序,并考虑在这里提问。请帮忙 问题:我有两个文件(标签分开)。文件A看起来像Python 比较两个选项卡分隔的文件,python,perl,bash,bioinformatics,Python,Perl,Bash,Bioinformatics,这是一个与生物信息学相关的问题,但仍然是一个非常重要的编程问题。对于下面给出的问题,我没有在bash中构建一些行程序,并考虑在这里提问。请帮忙 问题:我有两个文件(标签分开)。文件A看起来像 chr1 17050255 234916798 chr1 36688211 36840408 chr1 153961765 154156955 chr1 154128722 154194653 chr1 154130378 154156872 chr1
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中第四列的值
谢谢你我绝对推荐你看看这样做。将两者加载到单独的数据帧中,然后您应该能够以您希望看到的格式将它们合并在一起。我绝对建议您查看以执行类似操作。将两者加载到单独的数据帧中,然后您应该能够以您希望看到的格式将它们合并在一起。使用bedtools
(你也可以问)使用床上工具: (你也可以问)你可以用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;
#/usr/bin/env perl
严格使用;
使用utf8;
使用“全部”警告;
使用数据打印机;
使用DBI;
my$dbh=DBI->connect('DBI:CSV:',未定义,未定义{
f_编码=>'utf8',
csv_quote_char=>未定义,
csv_escape_char=>未定义,
csv\u sep\u char=>“\t”,
csv\u eol=>“\n”,
csv_quote_space=>0,
csv_quote_null=>0,
csv_表=>{
fileA=>{file=>'fileA.tsv'},
fileB=>{file=>'fileB.tsv'},
},
RaiseError=>1,
PrintError=>1,
})或死“DBI/DBD::CSV错误:”$DBI::errstr;
我的$sth=$dbh->prepare(断开连接;
(不过,我不确定是否理解您的重叠情况)您可以使用类似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;
!/usr/bin/env perl
严格使用;
使用utf8;
使用“全部”警告;
使用数据打印机;
使用DBI;
my$dbh=DBI->connect('DBI:CSV:',未定义,未定义{
f_编码=>'utf8',
csv_quote_char=>未定义,
csv_escape_char=>未定义,
csv\u sep\u char=>“\t”,
csv\u eol=>“\n”,
csv_quote_space=>0,
csv_quote_null=>0,
csv_表=>{
fileA=>{file=>'fileA.tsv'},
fileB=>{file=>'fileB.tsv'},
},
RaiseError=>1,
PrintError=>1,
})或死“DBI/DBD::CSV错误:”.$DBI::errstr;
我的$sth=$dbh->prepare(断开连接;
(我不确定我是否理解您的重叠条件)您如何定义“重叠”?鉴于上述数据,您的预期输出是什么?对于此类问题,通常需要一个从示例输入中得到的预期输出的实际示例。“结果”的字符串不要出现在输入中,因此输出不会以清晰的方式显示您想要的内容。如果您选择Python路线,使用模块解析输入文件可能会使您的生活更轻松。您的bash脚本失败了。您是否有Perl或Python中的任何内容,或者什么都没有?显示任何代码可能有助于理解您正在尝试执行的操作史蒂夫:这些是碱基对,所以在1号染色体上,我有一个从17050255开始到234916798结束的片段。如果在文件B中也有一个片段在1号染色体上,它的起始值或结束值在17050255和234916798之间,它被定义为重叠。你如何定义“重叠”呢?根据上述数据,您的预期输出是什么?对于这类问题,通常需要一个由示例输入产生的预期输出的实际示例。“结果”的字符串不要出现在输入中,因此输出不会以清晰的方式显示您想要的内容。如果您选择Python路线,使用模块解析输入文件可能会使您的生活更轻松。您的bash脚本失败了。您是否有Perl或Python中的任何内容,或者什么都没有?显示任何代码可能有助于理解您正在尝试执行的操作史蒂夫:这些是碱基对,所以在1号染色体上,我有一个从17050255开始到234916798结束的片段。如果在文件B中也有一个片段在1号染色体上,并且它的起始值或结束值在17050255和234916798之间,它被定义为重叠。熊猫要查找重叠吗?我很瘦k你需要精确匹配,我相信这里的重叠并不意味着在这种情况下相等。@petr:不,你不必把核苷酸含量放在里面。这纯粹是数学上的。熊猫会查找重叠吗?我想你需要精确匹配,这里的重叠不意味着在这种情况下相等。@petr:不,我相信你不必把核苷酸含量放进去。这纯粹是数学问题。我不明白你的问题:看看像-wa这样的交叉床选项,使用cut来减少列数。我的评论来的太晚了!:-)我已经解决了Pierre,我用-wa和-wb选项一起得到了所需的输出。谢谢你的启发:)我不明白你的问题:看看像-wa这样的intersectBed选项,使用cut来减少列数。我的评论来了,太晚了!:-)我已经解决了这个问题,我使用-wa和-wb选项同时获得了所需的输出。谢谢你启发我:)