【问题标题】:Perl Column comparison in two filesPerl 两个文件中的列比较
【发布时间】:2014-02-16 07:40:33
【问题描述】:

我有两个文件“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 代码,它的输出应该是两个文件,即一个文件具有常见的“开始”和“结束”位置列表,另一个文件具有唯一的“开始”和“结束”位置。

【问题讨论】:

    标签: perl hash


    【解决方案1】:

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

    设计部分提出了一个密钥,该密钥对于每个开始、结束对都是唯一的,但使用起来并不难。由于 start 和 end 是数字,这应该很容易:

    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

    【讨论】:

    • 感谢您的帮助。从中我能理解的是,我们制作了一个开始和结束的密钥对。但我的问题是我有两个文件。如何比较一个密钥对一个文件与另一个文件。
    • 哈希 %matchups 是您使用 process() 提供的所有文件的合并。通过输入两个文件,您将获得计数为1(唯一)的行和计数为2(两个文件中都存在)的行。
    猜你喜欢
    • 2015-07-08
    • 2018-09-05
    • 2014-06-14
    • 2014-05-31
    • 1970-01-01
    • 2018-08-17
    • 2012-03-18
    • 1970-01-01
    • 2012-03-18
    相关资源
    最近更新 更多