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开始打印整行
如何只获得这些字段?
答案 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;