Regex 从与关联字符串组合的列表中列出唯一位置

Regex 从与关联字符串组合的列表中列出唯一位置,regex,perl,Regex,Perl,我需要从文件中列出唯一的数字位置,然后在每个位置后枚举唯一的索引 如果有多个不同的索引,那么我希望在单独的行中列出每个位置/索引 我想这是最好的解决办法,但我一点运气都没有。有无模块的方法吗 如果我的解释不合理,请告诉我 文件1数据: 7065_8#10 99269 -t 7065_8#10 126477 -c 7065_8#10 413711 +T 7065_8#10 586681 -a 7065_8#10 820739 +T 7065_8#10 927102 +T 7065_8#10 942

我需要从文件中列出唯一的数字位置,然后在每个位置后枚举唯一的索引

如果有多个不同的索引,那么我希望在单独的行中列出每个位置/索引

我想这是最好的解决办法,但我一点运气都没有。有无模块的方法吗

如果我的解释不合理,请告诉我

文件1数据:

7065_8#10 99269 -t
7065_8#10 126477 -c
7065_8#10 413711 +T
7065_8#10 586681 -a
7065_8#10 820739 +T
7065_8#10 927102 +T
7065_8#10 942973 +T
7065_8#10 1075448 +G
7065_8#11 99269 -t
7065_8#11 126477 -t
7065_8#11 413711 +T
7065_8#11 470211 +G
7065_8#10 927102 -a
7065_8#10 942973 +T 
中间结果:

99269 ( -t -t )
126477 ( -c -t )
413711 ( +T +T )
586681 ( -a )
820739 ( +T )
927102 ( +T -a )
942973 ( +T +T )
1075448 ( +G )
470211 ( +G )
最终输出:

99269 ( -t )
126477 ( -c )
126477 ( -t )
413711 ( +T )
586681 ( -a )
820739 ( +T )
927102 ( +T )
927102 ( -a )
942973 ( +T )
1075448 ( +G )
470211 ( +G )
以下是我的初始(未成功)代码:

#/usr/bin/perl
严格使用;
使用警告;
使用自动模具;
使用5.010;
my$outputfile=“/Users/edwardtickle/Documents/positionarray.txt”;
打开文件1“/Users/edwardtickle/Documents/CC22indelscc.txt”;
打开(OUTPUTFILE,“>$OUTPUTFILE”);
使用列表::MoreUtils qw(uniq);
我的@base=();
我的@words=();
而(){
如果(/^\S+\S+(\d+)\S+(\S+/){
推送@words$1;
}
}
我的@unique_words=uniq@words;
打印输出文件“@unique\u words\n”;
关闭文件1;
关闭输出文件;

目前,这给了我一个由空格分隔的行上唯一位置的列表,我无法确定如何每行打印一个。

好的,我将创建一个错误列表,而不是将它们作为注释发布,因为它们开始增加

  • \@unique\u单词“@base”是一个语法错误。你需要在它们之间加个逗号
  • my@words=();my@uniq_words=uniq@words只能生成空列表。使用
    my
    时,在该范围(块)中创建一个新变量
  • 在你的循环中使用
    my@words=qw($1)。这是错误的,因为:
    
  • 在每次循环迭代中创建一个新变量
  • 每次使用
    =
    而不是push来覆盖该数组
  • qw($1)
    不插值变量,因此它只返回一个文本
    $1
    。这里根本不需要
    qw()
以下是您要做的:

  • 不使用正则表达式进行匹配,只需拆分行,例如,
    my($junk,$num,$indel)=拆分
  • 不要显式打开文件进行输入和输出,只需使用shell重定向和菱形操作符
    ,例如
    while()
    perl script.pl input.txt>output.txt
  • 将分割的相关结果存储在散列中,例如,
    $data{$num}{$indel}++
    。如果需要保留顺序,请将唯一的数字存储在数组中
  • 在循环之后,遍历存储的唯一数字,并使用类似于
    print“$num(.join(“,keys%{$data{$num}”)”的内容从散列中打印相关的键。\n”
编辑:

perl program.pl input.txt > output.txt
在阅读评论之后,很明显顺序并不重要,“索引”应该在单独的行中。这使我们可以简单地打印文件中显示的值(保留原始顺序),同时避免打印重复的值

use strict;
use warnings;

my %data;
while (<>) {
    my ($junk, $num, $indel) = split;
    unless (exists $data{$num}{$indel}) {
        print "$num ( $indel )\n";
    }
    $data{$num}{$indel}++;
}
事实上,作为纯粹的学术活动,这一点可以进一步减少。通过(ab)使用后缀增量
++
第一次用于未初始化值时返回假值这一事实,我们可以将检查和增量结合起来:

my %data;
while (<DATA>) {
    my ($junk, $num, $indel) = split;
    unless ($data{$num}{$indel}++) {   # both check and incrementation
        print "$num ( $indel )\n";
    }
}
my%数据;
而(){
我的($junk,$num,$indel)=拆分;
除非($data{$num}{$indel}++){#检查和递增
打印“$num($indel)\n”;
}
}

请注意,这只是为了好玩,不建议用于生产代码,因为它相当模糊。

好的,我将列出错误列表,而不是将它们作为注释发布,因为它们正开始增加

  • \@unique\u单词“@base”是一个语法错误。你需要在它们之间加个逗号
  • my@words=();my@uniq_words=uniq@words只能生成空列表。使用
    my
    时,在该范围(块)中创建一个新变量
  • 在你的循环中使用
    my@words=qw($1)。这是错误的,因为:
    
  • 在每次循环迭代中创建一个新变量
  • 每次使用
    =
    而不是push来覆盖该数组
  • qw($1)
    不插值变量,因此它只返回一个文本
    $1
    。这里根本不需要
    qw()
以下是您要做的:

  • 不使用正则表达式进行匹配,只需拆分行,例如,
    my($junk,$num,$indel)=拆分
  • 不要显式打开文件进行输入和输出,只需使用shell重定向和菱形操作符
    ,例如
    while()
    perl script.pl input.txt>output.txt
  • 将分割的相关结果存储在散列中,例如,
    $data{$num}{$indel}++
    。如果需要保留顺序,请将唯一的数字存储在数组中
  • 在循环之后,遍历存储的唯一数字,并使用类似于
    print“$num(.join(“,keys%{$data{$num}”)”的内容从散列中打印相关的键。\n”
编辑:

perl program.pl input.txt > output.txt
在阅读评论之后,很明显顺序并不重要,“索引”应该在单独的行中。这使我们可以简单地打印文件中显示的值(保留原始顺序),同时避免打印重复的值

use strict;
use warnings;

my %data;
while (<>) {
    my ($junk, $num, $indel) = split;
    unless (exists $data{$num}{$indel}) {
        print "$num ( $indel )\n";
    }
    $data{$num}{$indel}++;
}
事实上,作为纯粹的学术活动,这一点可以进一步减少。通过(ab)使用后缀增量
++
第一次用于未初始化值时返回假值这一事实,我们可以将检查和增量结合起来:

my %data;
while (<DATA>) {
    my ($junk, $num, $indel) = split;
    unless ($data{$num}{$indel}++) {   # both check and incrementation
        print "$num ( $indel )\n";
    }
}
my%数据;
而(){
我的($junk,$num,$indel)=拆分;
除非($data{$num}{$indel}++){#检查和递增
foreach my $position (keys %indel_lookup) {
   foreach my $indel (keys %{$indel_lookup{$position}}) {
        print "$position ( $indel )\n";
   }
}
use strict;
use warnings;

my %data;

while (<DATA>) {
  my ($base, $word) = (split)[1,2];
  ++$data{$base}{$word}
}

for my $base (sort { $a <=> $b } keys %data) {
  for my $word (keys %{ $data{$base} }) {
    print "$base ( $word )\n";
  }
}

__DATA__
7065_8#10 99269 -t
7065_8#10 126477 -c
7065_8#10 413711 +T
7065_8#10 586681 -a
7065_8#10 820739 +T
7065_8#10 927102 +T
7065_8#10 942973 +T
7065_8#10 1075448 +G
7065_8#11 99269 -t
7065_8#11 126477 -t
7065_8#11 413711 +T
7065_8#11 470211 +G
7065_8#10 927102 -a
7065_8#10 942973 +T 
99269 ( -t )
126477 ( -t )
126477 ( -c )
413711 ( +T )
470211 ( +G )
586681 ( -a )
820739 ( +T )
927102 ( +T )
927102 ( -a )
942973 ( +T )
1075448 ( +G )