我在该网站上进行了搜索,令人惊讶的是,我似乎找不到适合我特定问题的东西。所以我想我会发布它,看看你们中一些更有经验的程序员如何解决问题。
我有一个类似文本文件的电子表格(许多行带有制表符分隔的列),我想搜索某些标签(例如脚手架1253.1_size81005.6.32799_7496)并用更简化的标签替换它们(例如脚手架1253.1a)。这些标签仅在文本文件的第一列中。我已经编写了脚本,这样我就有了一个散列,其中旧标签作为键,对应于新标签作为它们各自的值。这个哈希有大约 26000 行。所以基本上我想一一取散列键,在文本文件中搜索它们,然后用它们各自的散列值替换它们。
我有一个很好的服务器可用,所以如果它太复杂而无法使其成为特定于加速进程的第一列,那么没关系。
这是我到目前为止所拥有的:
use warnings;
$gtf = './Hc_genome/Hc_rztk_1+2+8+9.augustus.gtf';
open(FASTAFILE2, $gtf);
@gtfarray = <FASTAFILE2>;
#print @gtfarray;
my %hash;
while (<>)
{
chomp;
my ($key, $val) = split /\t/;
$hash{$key} .= exists $hash{$key} ? ",$val" : $val;
}
#print %hash;
while (my ($find, $replace) = each %hash) {
foreach (@gtfarray){
$_ =~ s/$find/$replace/g;
push @newgtf, $_;
}
}
print @newgtf;
此代码似乎不起作用,因为它没有完成。我很确定这是 foreach 循环结构的问题。抱歉,我不知道有任何其他方法可以做到这一点。有没有人有更好的方法来运行这个文件并进行替换?
任何投入将不胜感激!谢谢,
安德鲁
@DVK
这是您的 mod 的完整脚本,它在您的 while 循环中遇到语法错误,知道为什么它不接受它吗?再次感谢!
use warnings;
$gtf = './Hc_genome/Hc_rztk_1+2+8+9.augustus.gtf';
open(FASTAFILE2, $gtf);
my %hash;
while (<>){
chomp;
my ($key, $val) = split /\t/;
$hash{$key} .= exists $hash{$key} ? ",$val" : $val;
}
while $line (<FASTAFILE2>){
my @fields = split(/\t/, $line);
# If you only care about first column, don't need the foreach loop below;
# just do the loop insides on $fields[0]
foreach my $field (@fields) {
$field = $hash{$field} if exists $hash{$field};
print $outfile "$field\t"; # Small bug - will print training \t
}
print $outfile "\n"
}
__END__
这是语法错误: perl gtf_mod2.pl <./Hc_genome/header_file.txt gtf_mod2.pl 第 14 行的语法错误,“while $line” 附近 gtf_mod2.pl 第 23 行的语法错误,“}” 执行 gtf_mod2。 pl 由于编译错误而中止。