-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、つまり5番目と6番目のフィールドのみが必要ですが、これは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;
...

: これは上と下に分割されるため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

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](7 番目のフィールド、インデックスはゼロベースであることを思い出してください) は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 に答える
0
my @fields=split /:|\s+/, $line;
于 2012-07-21T15:39:50.600 に答える