-2
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,e 5th 和 6th 字段,但这是从 2105 2123 开始打印整行

如何只获得那些字段?

4

5 回答 5

3

试试这个。

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

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

于 2012-07-21T13:16:38.850 回答
1

正如其他人所说,问题在于您在冒号而不是空格上进行拆分。

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

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

您的程序的其余部分应该可以正常工作,尽管$id =~ s/\s+//删除空格的行是不必要的,并且我对语句末尾的$id杂散感到困扰。这将读取并丢弃文件中的下一行,我认为这是故意的,但它应该单独在一行上,而不是像容易错过的那样隐藏起来。<>print

于 2012-07-21T14:05:11.977 回答
0
my @fields=split /:|\s+/, $line;
于 2012-07-21T15:39:50.600 回答
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
于 2012-07-21T13:16:33.777 回答
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;
}
于 2012-07-21T13:21:55.997 回答