从制表符分隔文本文件中的列中提取值

时间:2015-02-11 21:11:00

标签: regex r split extract

perlI有制表符分隔的文本文件,包含3列,如下所示

Name                Description                         Ontology
dda1        box1_homodomain gn=box1 os=homo   C:Cell;C:surface;F:binding;P:toy
dda2        sox2_plurinet gn=plu os=mouse     C:Organ;F:transport;P:carrier;P:avi
dd13        klf4_iPSC gn=klf os=Bos           C:Cell;F:tiad;P:abs;P:digestion 

现在我想将值描述中的值(gn = xxx和os = xxx)和Ontology列中的值(C:xxx; F = xxx; P = xxx;)分成如下列的单独列:

Name   Description     gn      os        C              F              P       
dda1  box1_homodomain box1    homo    Cell;surface    binding          toy
dda2  sox2_plurinet   plu     mouse   Organ;          transport    carrier;avi
dd13  klf4_iPSC       klf     Bos     Cell;            tiad       abs;digestion 

我希望这必须导出为tab delim文件或excel文件。如果有人可以指导我如何在perl中实现这一点,那将是非常好的。请帮帮我。

提前致谢

1 个答案:

答案 0 :(得分:0)

我在Java工作5年后看到了perl问题。我很兴奋,我想做这个练习。现在,我记得我做过的事情并粘贴下面的代码。只需为最后一栏丰富相同的代码' Ontology'使用正则表达式和相同的哈希概念,你就完成了。你可以在perl中做多种方式。它可能是更多的代码。但是,我记得以下方式。

#!/usr/bin/perl

use Data::Dumper;
my %output;
open(IN, "stack.txt");
while(<IN>) {
  my @nameColumns, @descriptionColumns;
  if ($_ =~ /Name/) {
    $ouput{'Name'} = @nameColumns;
    $ouput{'Description'} = @descriptionColumns;
    next;
  }
  my ($group1, $group2, $group3, $group4, $group5, $group6, $group7) = ($_ =~ m/(\w+)\s+(\w+)\s+(\w+)\=(\w+)\s+(\w+)\=(\w+)\s+(.*)/gi);
  # Column 1
  @nameColumns = @{$output{'Name'}};
  push(@nameColumns, $group1);
  $output{'Name'} = [@nameColumns];

  # Column 2
  #print "$group2, $group3, $group4, $group5, $group6, $group7"; 
  @descriptionColumns = @{$output{'Description'}};
  push(@descriptionColumns, $group2);
  $output{'Description'} = [@descriptionColumns];

  # column 3
  @column3 = @{$output{$group3}};
  push(@column3, $group4);
  $output{$group3} = [@column3];

  # column 4
  @column4 = @{$output{$group5}};
  push(@column4, $group6);
  $output{$group5} = [@column4];

  #Column ...

}
close(IN);
print Dumper(\%output);

&#13;
&#13;
$VAR1 = {
          'gn' => [
                    'box1',
                    'plu',
                    'klf'
                  ],
          'os' => [
                    'homo',
                    'mouse',
                    'Bos'
                  ],
          'Name' => [
                      'dda1',
                      'dda2',
                      'dd13'
                    ],
          'Description' => [
                             'box1_homodomain',
                             'sox2_plurinet',
                             'klf4_iPSC'
                           ]
        };
&#13;
&#13;
&#13;

注意:输出如上。如果您还没有弄明白,如何完成此计划让我知道要花更多时间