以适当的方式分裂线

时间:2012-07-21 13:06:51

标签: perl

if($line =~ /^HWI.*/)
{
    my @fields=split ":",$line;
    $id= $fields[5].":".$fields[6];
    print $fields[5]," ",$fields[6]; <>;
    $id =~ s/\s+//;
    $hash1{$id}=$line;
  }else{
    $hash1{$id}.= $line;
  }

大家都知道这个脚本只打印第5和第6个字段,分别用':'

我的输入是这样的:

HWI-1KL120:99:C0C9MACXX:6:1101:2105:2123    0   chr5    75483987    0   82M3I16M    *   0   0

我只想要2105 2123 i,第5和第6个字段,但这是从2105 2123开始打印整行

如何只获得这些字段?

5 个答案:

答案 0 :(得分:3)

试试这个。

...
my @fields = split /[:\s]/, $line;
$id = qq{$fields[5]:$fields[6]};
print "$fields[5] $fields[6]";
$hash1{$id} = $line;
...

这会在:上的whitespace 分开,因此将字段条目#6分开(如果这在您的问题中是可行的)。

答案 1 :(得分:1)

正如其他人所说,问题在于你是在分裂冒号,而不是在空白上。

不是使用split,而是找到所有既不是冒号也不是空格的字符序列

  my @fields = $line =~ /([^:\s]+)/g;

你的程序的其余部分应该可以正常工作,尽管从$id =~ s/\s+//删除空格的行$id是不必要的,我对<>末尾的print感到困扰1}}陈述。这将读取并丢弃文件中的下一行,我认为它是故意的,但它本身应该在一条线上,而不是像它可能容易被遗漏的那样隐藏起来。

答案 2 :(得分:0)

白色空间上的

split或像这样的冒号:

perl -le '$line=qq(HWI-1KL120:99:C0C9MACXX:6:1101:2105:2123 0 chr5 75483987 0 82M3I16M * 0 0);@F=split /[\s:]/,$line;print join q( ),$F[5],$F[6]'
2105 2123

答案 3 :(得分:0)

你在冒号分裂线,2123之后没有冒号所以$fields[6](第七个字段,记住索引是零)是2123 0 chr5 75483987 0 82M3I16M * 0 0

你可能最好在初始正则表达式中完成所有操作:

if($line =~ /^HWI[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:(([^:]*):(\S*))/) {
  $id = $1;
  $id =~ s/\s+//;
  $hash{$id} = $line;
  print "$2 $3", <>;
} else {
  $hash{$id} .= $line;
}

答案 4 :(得分:0)

my @fields=split /:|\s+/, $line;