gpt4 book ai didi

regex - 正则表达式代码

转载 作者:行者123 更新时间:2023-12-02 02:09:35 27 4
gpt4 key购买 nike

我需要找到两个制表符分隔文件之间的匹配项,如下所示:

文件 1:

ID1  1  65383896    65383896    G   C  PCNXL3
ID1 2 56788990 55678900 T A ACT1
ID1 1 56788990 55678900 T A PRO55

文件 2

ID2 34    65383896   65383896       G   C  MET5
ID2 2 56788990 55678900 T A ACT1
ID2 2 56788990 55678900 T A HLA

我想做的是检索两个文件之间的匹配行。我想匹配的是基因ID之后的everyting

到目前为止,我已经编写了这段代码,但不幸的是 perl 一直给我错误:使用“在模式匹配中使用未初始化的值 (m//)”

你能帮我找出我哪里做错了吗?

提前致谢!

use strict;

open (INA, $ARGV[0]) || die "cannot to open gene file";
open (INB, $ARGV[1]) || die "cannot to open coding_annotated.var files";

my @sample1 = <INA>;
my @sample2 = <INB>;

foreach my $line (@sample1) {
my @tab = split (/\t/, $line);

my $chr = $tab[1];
my $start = $tab[2];
my $end = $tab[3];
my $ref = $tab[4];
my $alt = $tab[5];
my $name = $tab[6];

foreach my $item (@sample2){
my @fields = split (/\t/,$item);

if ( $fields[1] =~ m/$chr(.*)/
&& $fields[2] =~ m/$start(.*)/
&& $fields[4] =~ m/$ref(.*)/
&& $fields[5] =~ m/$alt(.*)/
&& $fields[6] =~ m/$name(.*)/
) {
print $line, "\n", $item;
}
}
}

最佳答案

从表面上看,您的代码似乎没有问题(尽管我没有对其进行调试)。如果您没有我无法发现的错误,可能是输入数据具有 RE 特殊字符,当您按原样放置时会混淆正则表达式引擎(例如,如果任何变量具有“$”字符) .也可能是你在某些地方有空格而不是制表符,在这种情况下你确实会得到一个错误,因为你的拆分会失败。

无论如何,最好只编写一个包含所有字段的正则表达式。我下面的代码更符合 Perl 的习惯。我喜欢使用隐含的 $_,在我看来这使代码更具可读性。我刚刚使用您的输入文件对其进行了测试,它可以正常工作。

use strict;

open (INA, $ARGV[0]) or die "cannot open file 1";
open (INB, $ARGV[1]) or die "cannot open file 2";

my @sample1 = <INA>;
my @sample2 = <INB>;


foreach (@sample1) {
(my $id, my $chr, my $start, my $end, my $ref, my $alt, my $name) =
m/^(ID\d+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)/;
my $rex = "^ID\\d+\\s+$chr\\s+$start\\s+$end\\s+$ref\\s+$alt\\s+$name\\s+";
#print "$rex\n";
foreach (@sample2) {
if( m/$rex/ ) {
print "$id - $_";
}
}
}

此外,输入数据的规律性如何?您在字段之间只有一个选项卡吗?如果是这种情况,则没有必要将这些行拆分为 7 个不同的字段 - 您只需要两个:行的 ID 部分和其余部分。第一个正则表达式是

(my $id, my $restOfLine) = m/^(ID\d+)\s+(.*)$/;

并且您正在使用与上述类似的技术在第二个文件中搜索 $restOfLine。

如果您的文件巨大并且性能是个问题,您应该考虑将第一个正则表达式(或字符串)放在映射中。这将为您提供 O(n*log(m)),其中 n 和 m 是每个文件中的行数。

最后,当我需要比较日志时,我遇到了类似的挑战。日志应该是相同的,除了每行开头的时间标记。但更重要的是:大多数行都是相同的且顺序。如果这是您所拥有的,并且对您有意义,您可以:

  1. 首先从每一行中删除 IDxxx:perl -pe "s/ID\d+ +//" file >cleanfile
  2. 然后使用 BeyondCompare 或 Windiff 比较文件。

关于regex - 正则表达式代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13491710/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com