1

私はperlの完全なアマチュアです。検索を実行できるように、SAMファイルの参照名を変更するために適用しようとしている検索と置換の機能について質問したいと思います。ファイルは非常に大きく(5〜17ギガ)、プログラミング言語を使用せずにテキストエディターで開いて、一致を実行できます。

基本的に、perlは「gi | 149288852 | ref | NC_000067.5 | NC_000067」などの文字列全体に一致し、全体を「chr1」のみに置き換えたいと思います。

ただし、これまでのところ、「chr1 | chr1 | chr1 | chr1|chr1」または「gi|chr1 | ref | NC000067.g|NC_000067」に置き換えることしかできないようです。

誰かが私を助けることができますか?

編集:

私はいくつかの異なることを試しましたが、私がやろうとしているのは、上司が誰かから受け取ったプログラムを変更して、これを正しく行うことです。以下に投稿します。

#!/usr/bin/perl

use strict;
use warnings;

my %Chr = (

    "gi|149288852|ref|NC_000067.5|NC_000067" => "chr1",
    "gi|149288869|ref|NC_000076.5|NC_000076" => "chr10",
    "gi|149288871|ref|NC_000077.5|NC_000077" => "chr11",
    "gi|149292731|ref|NC_000078.5|NC_000078" => "chr12",
    "gi|149292733|ref|NC_000079.5|NC_000079" => "chr13",
    "gi|149292735|ref|NC_000080.5|NC_000080" => "chr14",
    "gi|149301884|ref|NC_000081.5|NC_000081" => "chr15",
    "gi|149304713|ref|NC_000082.5|NC_000082" => "chr16",
    "gi|149313536|ref|NC_000083.5|NC_000083" => "chr17",
    "gi|149321426|ref|NC_000084.5|NC_000084" => "chr18",
    "gi|149323268|ref|NC_000085.5|NC_000085" => "chr19",
    "gi|149338249|ref|NC_000068.6|NC_000068" => "chr2",
    "gi|149352351|ref|NC_000069.5|NC_000069" => "chr3",
    "gi|149354223|ref|NC_000070.5|NC_000070" => "chr4",
    "gi|149354224|ref|NC_000071.5|NC_000071" => "chr5",
    "gi|149361431|ref|NC_000072.5|NC_000072" => "chr6",
    "gi|149361432|ref|NC_000073.5|NC_000073" => "chr7",
    "gi|149361523|ref|NC_000074.5|NC_000074" => "chr8",
    "gi|149361524|ref|NC_000075.5|NC_000075" => "chr9",
    "gi|149361525|ref|NC_000086.6|NC_000086" => "chrX",
    "gi|149361526|ref|NC_000087.6|NC_000087" => "chrY", 
    );

my $usage = "\n\n\tUsage: convert.pl <SAM file>\n\nThis script converts NCBI ref#s to chr #s\n\n";

die $usage unless ( @ARGV == 1);

my $file = $ARGV[0];

open (IN, "$file") or die "Can't open file: $file\n";

while (<IN>){

    if (/\S+\s+\d+\s+(gi\S+)/){

    my $tag = $1;
    if (exists $Chr{$tag}){
        my $line = $_;
        $line =~ s/'$tag'/$Chr{$tag}/;
        print $line;
    }
    else {
        die "\n\n\nHash value doesn't exist for $tag $_\n\n";
    }
    }
    else {

    print $_;
    }
}

これは、「gi | chr1 | ref | NC000067.g|NC_000067」で出力されます。

私もこれを試しました:

perl -pi -w -e 's/gi|149288852|ref|NC_000067.5|NC_000067/chr1/g;' *.sam

一つずつできるかどうか見てみますが、それは「chr1 | ch1 | chr1 | chr1|chr1」で出てきます

4

1 に答える 1

4

1つの問題は次のとおりです。

$line =~ s/'$tag'/$Chr{$tag}/;

あなた$tagはまだメタキャラクターを含んでいます。

使用する:

$line =~ s/\Q$tag/$Chr{$tag}/;
于 2012-08-02T20:01:57.100 に答える