繁体   English   中英

在Perl中以相反的顺序匹配字符串

[英]Matching strings in reverse order in Perl

我在第一列和另外两列具有值的字符串对中用空格将字符串对隔开。 我想创建一个新文件,其中成对的字符串在同一行中匹配,无论它们的顺序如何。 例如,打印包含对“ GAT_1 GAT_2”的行,并在其旁边打印包含“ GAT_2 GAT_1”的行。 将每个字符串分配给给定对的变量后,如何在不重复的情况下比较它们在不同行中的位置?

# 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

输出:

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

https://stackoverflow.com/a/34189380/103780中的 my @keys = splice(@fields, 0, 2); my $key = join(' ', @keys); my $skey = join (' ', sort @keys); push(@{$unique{$skey}{$key}}, @fields);更改将为您提供所需的内容:(未经测试): my @keys = splice(@fields, 0, 2); my $key = join(' ', @keys); my $skey = join (' ', sort @keys); push(@{$unique{$skey}{$key}}, @fields); my @keys = splice(@fields, 0, 2); my $key = join(' ', @keys); my $skey = join (' ', sort @keys); push(@{$unique{$skey}{$key}}, @fields);

for my $skey (keys(%unique)) { for my $key (keys(%unique{$skey})) { print join("\\t", $key, @{$unique{$skey}{$key}}); print "\\t"; } print "\\n"; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM