两个文件中的Perl列比较

时间:2014-01-25 06:22:01

标签: perl hash

我有两个文件“1.txt”和“2.txt”。

两个文件的结构是:

Main_File1 Start End 
1           200   250
2           310   340

Main_File2  Start End 
1           200   250
2           350   370

我想写一个perl代码,其输出应该是两个文件,即一个文件具有常见的“开始”和“结束”位置列表,另一个文件具有唯一的“开始”和“结束”位置。

1 个答案:

答案 0 :(得分:1)

我猜你已经拥有了阅读这些文件的代码,只需要解析这些值并组织它们。

设计部分提出了一个对每个开始,结束对都是唯一的键,但不难使用。由于开头和结尾都是数字,这应该很简单:

our %matchups ;

sub process
{
  my ($lst_)= @_ ;
  for ( @$lst_ ) {
    my ($strt,$endn)= /\d+\w+(\d+)\w+(\d+)/ ;
    next unless $strt && $endn ;
    my $key= "${strt}_$endn" ;
    $matchups{$key}[0]= $_ ;
    $matchups{$key}[1] ++ ;
  }
}

sub outputmatch
{
  my ($dest,$multi)= @_ ;
  # open file
  for ( values %matchups ) {
    print $OUT $_->[0] if ( $_->[1] > 1 ) == $multi ;
  }
}

{
  process(@listfrom1txt) ;
  process(@listfrom2txt) ;

  outputmatch( "common.txt", 1 ) ;
  outputmatch( "uniq.txt", 0 ) ;
}

所以在这里我们创建一个start_end的密钥,然后在哈希内部构建一个数据结构,这是一个包含两个元素的数组。第一个元素是原始行,第二个元素是我们看到此条目的次数。

如果某一行是唯一的,则计数将为1;如果不是,那么它将大于1