我有一个很大的.txt文件,其中一部分显示如下 -
ID SNP
FT SNP 102
FT /note="refAllele: C SNPstrains: 4395_8_10=A 4395_8_7=A 4395_8_9=A "
FT /colour=1
FT SNP 1299
FT /note="refAllele: A SNPstrains: 6437_8_6=T (non-synonymous) (AA Gin->His) "
FT /colour=2
FT SNP 2134
FT /note="refAllele: C SNPstrains: 4395_8_12=T "
FT /colour=1
FT SNP 3205
FT /note="refAllele: C SNPstrains: 6437_8_12=T (synonymous) "
我也有这个脚本(我没写过) -
$cod{1} = "Int";
$cod{2} = "non";
$cod{3} = "syn";
$cod{4} = "stop";
$file = "Whole.pl";
open IN, "$file";
open OUT, ">whole2";
print OUT "Coordinate Type Strains\n";
while (<IN>) {
if (m/^FT\s+SNP\s+(\d+)/) {
$SNP = $1;
}
elsif (m/^FT\s+\/note="(.*)"/) {
$line = $1;
$count = ($line =~ tr/=/=/);
}
elsif (m/^FT\s+\/colour=(\d+)/) {
if ($cod{$1}) {
print OUT "$SNP $cod{$1} $count\n";
}
elsif (!$cod{$1}) {
print OUT "$SNP colour $1 $count\n";
}
}
}
它会创建一个新文件。对于上述数据,它会创建 -
Coordinate Type Strains
102 Int 3
1299 non 1
2134 Int 1
3205 syn 1
我对perl和编程很新,并且认为我只是理解这个脚本正在做什么。然而,对于显示非同义突变的菌株(例如.txt文件中的第二个),我想在输出文件中具有第四列,其详述氨基酸变化(例如(AA Gin->他的),.txt文件中第六行的结尾)。另外,我最好只想在输出中显示非同义突变,并完全保留“syn”和“int”。
我已经尝试了很多方法来做到这一点但没有一个有效。请问您能告诉我一种方法吗?
非常感谢提前。
最高
答案 0 :(得分:0)
假设:
您的/note
可能含有氨基酸变化作为最后一个元素。它必须用parens括起来,并以字母AA
开头,后跟一个或多个字母的序列,然后是->
,然后是另一个一个或多个字母的序列。
您只对non
类型感兴趣。
在您的第一个elsif
中,我们必须将$line
与可能的氨基酸变化相匹配:
}elsif(m/^FT\s+\/note="(.*)"/){
$line=$1;
$line =~ m/\((AA \w+->\w+)\)\s*$/;
$change = $1 || "";
...;
在您的第二个elsif中,我们仅在$cod{$1}
等于non
时打印:
}elsif(m/^FT\s+\/colour=(\d+)/){
print OUT "$SNP $count $change\n" if $cod{$1} eq "non";
# inner if/else not needed any longer.
}
此外,顶部的表格标题必须更改:
print OUT "Coordinate Strains Change\n";
您必须手动重新对齐列。
这会打印类似
的内容Coordinate Strains Change
1299 1 AA Gin->His
关于示例输入。