私は Perl を初めて使用し、行き詰まってしまったので、誰かが私を助けてくれるかどうか尋ねたかったのです。
oldname と newname の 2 つの列 (タブ区切り) を持つファイルがあります。
古い名前をキーとして、新しい名前を値として使用し、ハッシュとして保存したいと思います。
次に、別のファイル (gff ファイル) を開き、そこにあるすべての古い名前を新しい名前に置き換えて、別のファイルに書き込みたいと思います。
私は最善を尽くしましたが、多くのエラーが発生しています。
私が間違っていることを教えていただければ幸いです。
2 つのファイルの外観は次のとおりです。
oldname newname(SFXXXX) ファイル:
genemark-scaffold00013-abinit-gene-0.18 SF130001
augustus-scaffold00013-abinit-gene-1.24 SF130002
genemark-scaffold00013-abinit-gene-1.65 SF130003
検索して置換するファイル (行の 1 つの例):
scaffold00013 maker gene 258253 258759 . - . ID=maker-scaffold00013-augustus-gene-2.187;Name=maker-scaffold00013-augustus-gene-2.187;
これが私の試みです:
#!/usr/local/bin/perl
use warnings;
use strict;
my $hashfile = $ARGV[0];
my $gfffile = $ARGV[1];
my %names;
my $oldname;
my $newname;
if (!defined $hashfile) {
die "Usage: $0 hash_file gff_file\n";
}
if (!defined $gfffile) {
die "Usage: $0 hash_file gff_file\n";
}
###save hashfile with two columns, oldname and newname, into a hash with oldname as key and newname as value.
open(HFILE, $hashfile) or die "Cannot open $hashfile\n";
while (my $line = <HFILE>) {
chomp($line);
my ($oldname, $newname) = split /\t/;
$names{$oldname} = $newname;
}
close HFILE;
###open gff file and replace all oldnames with newnames from %names.
open(GFILE, $gfffile) or die "Cannot open $gfffile\n";
while (my $line2 = <GFILE>) {
chomp($line2);
eval "$line2 =~ s/$oldname/$names{oldname}/g";
open(OUT, ">SFrenamed.gff") or die "Cannot open SFrenamed.gff: $!";
print OUT "$line2\n";
close OUT;
}
close GFILE;
ありがとうございました!