Regex 在Perl中按相反顺序匹配字符串
我有一个文件,第一列中有成对的字符串,它们之间用空格隔开,另外两列中有值。 我想创建一个新文件,其中字符串对在同一行中匹配,而不管它们的顺序如何。 例如,打印包含对“GAT_1 GAT_2”的行,以及旁边包含“GAT_2 GAT_1”的行。 将每个字符串分配给给定对的变量后,如何在不重复的情况下比较不同行的字符串Regex 在Perl中按相反顺序匹配字符串,regex,perl,match,Regex,Perl,Match,我有一个文件,第一列中有成对的字符串,它们之间用空格隔开,另外两列中有值。 我想创建一个新文件,其中字符串对在同一行中匹配,而不管它们的顺序如何。 例如,打印包含对“GAT_1 GAT_2”的行,以及旁边包含“GAT_2 GAT_1”的行。 将每个字符串分配给给定对的变量后,如何在不重复的情况下比较不同行的字符串 # discard headers foreach $line (@file) { @columns = split (/\t/, $line); @strings = sp
# discard headers
foreach $line (@file) {
@columns = split (/\t/, $line);
@strings = split (/\s/, $columns[0]);
# pseudocode:
foreach line that has pair "$strings[0] $strings[1]" {
print $line,"\t", and $line where pair is "$strings[1] $strings[0]"
Input:
pair val1 val2
GAT_1 GAT_2 0.2 4.5
GAT_1 GAT_3 0.1 0.2
GAT_4 GAT_5 0.9 7.5
GAT_5 GAT_4 0.5 8.3
BLAC BABA 8.3 1.3
BABA BLAC 8.9 1.1
GAT_2 GAT_1 1.2 2.1
GAT_3 GAT_1 3.4 4.3
Ouput:
pair val1 val2 pair val1 val2
GAT_1 GAT_2 0.2 4.5 GAT_2 GAT_1 1.2 2.1
GAT_1 GAT_3 0.1 0.2 GAT_3 GAT_1 3.4 4.3
GAT_4 GAT_5 0.9 7.5 GAT_5 GAT_4 0.5 8.3
BLAC BABA 8.3 1.3 BABA BLAC 8.9 1.1
这里有一种解决这个问题的方法,它适用于任意数量的值列。基本方法是我在我的文章中建议的,即规范化键,然后将找到的任何值推送到数组中
use strict;
use warnings;
my %unique;
while (<DATA>) {
chomp;
next unless /^\S/;
my @fields = split;
my $key = join(' ', sort(splice(@fields, 0, 2)));
push(@{$unique{$key}}, @fields);
}
for my $key (keys(%unique)) {
print join("\t", $key, @{$unique{$key}});
print "\n";
}
__DATA__
pair val1 val2
GAT_1 GAT_2 0.2 4.5
GAT_1 GAT_3 0.1 0.2
GAT_4 GAT_5 0.9 7.5
GAT_5 GAT_4 0.5 8.3
BLAC BABA 8.3 1.3
BABA BLAC 8.9 1.1
GAT_2 GAT_1 1.2 2.1
GAT_3 GAT_1 3.4 4.3
小的变化将给你你想要的:
(未经测试):
my@keys=拼接(@fields,0,2);
我的$key=join(“”,@key);
my$skey=join(“”,sort@keys);
push(@{$unique{$skey}{$key}},@fields);
对于我的$skey(密钥(%unique)){
对于我的$key(key(%unique{$skey})){
打印连接(“\t”,$key,@{$unique{$skey}{$key}});
打印“\t”;
}
打印“\n”;
}
您只关心具有匹配(反向)对的行吗?此外,如何在拆分后强制执行严格数量的值?当然,这是干什么用的?看起来你自己并没有尽力去解决这个问题。伪代码是一个开始,但实际工作如何?@sln是的,我只关心那些行,但它们都应该有一个匹配的反向对。我试图避免为每个匹配生成具有以下输出的文件:pair val1 val2 pair val1 val2 GAT_1 GAT_2 0.2 4.5 GAT_2 GAT_1 1.2 2 2.1 GAT_2 GAT_1 1 1.2 2 2.1 GAT_1 GAT_2 0.2 4.5但我不知道如何在拆分后强制执行严格数量的值。这是为了消除文件中的冗余,因为对被视为不同的实体,但它们实际上是相同的。@马特·雅各布我真的想不出一个算法来解决这个问题,问题应该是“这有可能吗?”这是编程——任何事情都有可能专门研究散列。你的输入文件有多大?我现在明白你说的“规范化”是什么意思了。这是我自己无法理解的“拼接”。谢谢为什么需要“next EXCELLED/^\S/;”?next EXCELLED…
行跳过具有前导空格的行,这会忽略标题行。如果$.==1以明确跳过第一行。感谢您的解释。
GAT_4 GAT_5 0.9 7.5 0.5 8.3
GAT_1 GAT_2 0.2 4.5 1.2 2.1
BABA BLAC 8.3 1.3 8.9 1.1
GAT_1 GAT_3 0.1 0.2 3.4 4.3