Perl - 如何匹配数百万个耦合字符串?

问题描述

我对 Perl 和整个编程都很陌生,因此我的术语和编码想法可能会让人感到困惑或完全是胡说八道 - 在这点上,请您尽量避免使用行话来帮助我理解,谢谢.

我的问题的上下文是我有一个非常大的文件 (33GB),其中包含信息的多个方面,其中我已经成功地将数据中的每一列拆分为单独的元素。下面是数据格式的一个小快照:

HWI-D00461:137:C9H2FACXX:4:1101:1117:1997 1:N:0:CTTGTA 101 0 101 0
HWI-D00461:137:C9H2FACXX:4:1101:1117:1997 2:N:0:CTTGTA 101 0 101 0
HWI-D00461:137:C9H2FACXX:4:1101:1229:1999 1:N:0:CTTGTA 48 0 48 53
HWI-D00461:137:C9H2FACXX:4:1101:1229:1999 2:N:0:CTTGTA 77 0 77 24
HWI-D00461:137:C9H2FACXX:4:1101:1162:2000 1:N:0:CTTGTA 101 0 101 0
HWI-D00461:137:C9H2FACXX:4:1101:1162:2000 2:N:0:CTTGTA 101 0 101 0
HWI-D00461:137:C9H2FACXX:4:1101:1393:1965 1:N:0:CTTGTA 69 1 70 31
HWI-D00461:137:C9H2FACXX:4:1101:1393:1965 2:N:0:CTTGTA 101 0 101 0

这是我的原始拆分代码

open(FASTQ,"<",$input) or die "Failed to open '$input',$!\n";
while(my $line = <FASTQ>){
  chomp($line);
  my @columns = split(" ",$line); #Seperate columns by whitespace
  if($columns[5] > 0) {
    $n++; #Counts number of trimmed reads

我的下一步是定位唯一名称 ID (element[0])。如您所见,每个唯一 ID 都是成对出现的,一个一个。我想尝试让我的程序将第一个 ID 与其第二个相同的 ID 匹配。我试图创建一个这个元素的新数组,然后用换行符分割这个数组:

foreach ($columns[0]){
          my @read_ID = split(/\n/);
          *Do something*
          }

我认为这会将每个读取 ID 分隔为 @read_ID 内的单独元素。然后我打算使用 if(exists())if($read_ID[0] == $read_ID[1]) 来测试这些行是否匹配。当然,我已经可以在这里看到基本问题 - 我需要在由价值 33GB 的这些行(150+ 百万)组成的文件中为每一行/元素声明这一点。因此,我得出的结论是,使用特殊变量 $_,我可以使用每一行的输入,允许对每个匹配的行进行连续循环。但是,我意识到只有以下行会与原始输入匹配,此后每 2 行它就会不断变化 - 杀死循环。

我首先问我的方法/想法是否看起来合乎逻辑和适当,如果是,那么我如何添加一个循环,允许检查 2 行,然后更改以下 2 个唯一 ID?我希望这不会太令人困惑,因为我在打字时感觉会这样。非常感谢任何帮助!

愿意。

解决方法

每个唯一 ID 成对出现,一个接着一个。

要一次读取两行文件,可以使用以下命令:

while (1) {
   defined( my $line1 = <$fh> )
      or last;
   defined( my $line2 = <$fh> )
      or die("Incomplete file\n");

   my @fields1 = split(" ",$line1);
   my @fields2 = split(" ",$line2);

   $fields1[0] eq $fields2[0]
      or die("Ids of lines ".( $. - 1 )." and $. don't match.\n");

   # ...
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...