【问题标题】:Matching three columns of one file with three columns of another file in perl在perl中将一个文件的三列与另一个文件的三列匹配
【发布时间】:2015-08-07 10:11:32
【问题描述】:

我正在尝试将一个文件的 3 列(前三列)与第二个文件的三列 0、3、4 匹配。我对下面的代码有问题:请帮助我。谢谢。

#!usr/bin/perl
  use strict;
  use warnings;

  my $infile1 = $ARGV[0];
  my $infile2 = $ARGV[1];
  my $outfile = $ARGV[2];

  open (INFILE1,"<", $infile1) || die "Cannot open $infile1:$!\n";
  open (INFILE2, "<", $infile2) || die "Cannot open $infile2:$!\n";
  open (OUTFILE, ">", $outfile) || die "Cannot open $outfile:$!\n";

  my @array1;
  my @array2;
  my @array3;
  my @array4;
  my $_;
  while (<INFILE1>) {
      chomp;
      @array1 = split (' ', $_);
      push (@array2, "@array1\n");
      #print "@array2\n";
  }
  while (<INFILE2>) {
      chomp;
      @array3 = split (' ', $_);
      push (@array4, "@array3\n");
      #print "@array4\n";
  }
  #print "@array2\n";
  #print "@array4\n";
  foreach my $array2(@array2) {
       my @line = split(/\s+/,$array2);
       my $chr1 = $line[0];
       my $start1 = $line[1];
       my $end1 = $line[2];
       #print "$line[0]\n";
  foreach my $array4(@array4) {
       my @values = split(/\s+/, $array4);
       my $chr2 = $values[0];
       my $start2 = $values[3];
       my $end2 = $values[4];
      if (($chr1 eq $chr2) && ($start1 eq $start2) && ($end1 eq $end2)) {
         #print  "$start2\n";
         print  "$chr2\t$start2\t$end2\n";
       }
   }
 }

file1.txt 几行如下:

chr10   40095550        40096075
chr10   40102275        40102575
chr10   40139575        40140100

file2.txt 几行如下:

chr1    mm10_knownGene  exon    3205904 3207317 0.000000        -       .       gene_id "uc007aet.1"; transcript_id "uc007aet.1"; 
chr1    mm10_knownGene  exon    3213439 3215632 0.000000        -       .       gene_id "uc007aet.1"; transcript_id "uc007aet.1"; 
chr1    mm10_knownGene  stop_codon      3216022 3216024 0.000000        -       .       gene_id "uc007aeu.1"; transcript_id "uc007aeu.1"; 

【问题讨论】:

  • 试着解释一下比赛对你意味着什么...
  • 就像一个文件的所有三列的值应该等于第二个文件的三列,然后它应该打印出匹配的行。
  • 您尝试过使用哈希吗?
  • 不。我实际上是在很长一段时间后使用 perl....我试图刷新我的记忆。对不起。

标签: perl matching


【解决方案1】:

您的问题的解决方案是阅读perldata 并查看hashes 部分。这些是键值对的关联数组。

它使您的大部分代码变得多余。

my %exists; 

while ( <INFILE1> ) {
     my ( $chr, $firstnum, $secondnum) = split; 
     $exists{$chr}{$firstnum}{$secondnum}++; 
}

while ( <INFILE2> ) {
    my ( $chr, $mm, $thing, $firstnum, $secondnum ) = split;
    print if $exists{$chr}{$firstnum}{$secondnum}; 
}

我还建议您使用带有词法文件句柄的 3 个参数 open 来代替。

例如:

 open ( my $infile1_fh, "<", $infile1 ) or die $!;

然后

 while ( <$infile1_fh> ) {

因为它们是本地范围的,而不是全局范围的。

【讨论】:

    猜你喜欢
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多