我一直在编写一个脚本,该脚本需要两个文件来提取数据的特定部分以创建一个新文件。 如果您想查看完整的文件,请访问以下 GitHub 链接:enter link description here
文件一(报告文件)是一种当值 >=0.5 时向我报告的文件类型(第 N°6 列是我感兴趣的值)。 这个文件是这样的(这只是一部分):
AGY29650_2_NA netOGlyc-4.0.0.13 CARBOHYD 2 2 0.0804934 . .
AGY29650_2_NA netOGlyc-4.0.0.13 CARBOHYD 4 4 0.0925522 . .
AGY29650_2_NA netOGlyc-4.0.0.13 CARBOHYD 13 13 0.0250116 . .
AGY29650_2_NA netOGlyc-4.0.0.13 CARBOHYD 23 23 0.565981 . .
...
文件二(fasta文件)是生物信息学中使用的一种文件类型,如下所示(这只是一部分):
>AGY29650.2|NA spike protein
MTYSVFPLMCLLTFIGANAKIVTLPGNDA...EEYDLEPHKIHVH*
我的脚本的目的是当第 N°6 列中的值 >=0.5 时取第 1 列和第 4 列,例如,第 N°4 行是 #POSITIVE 值,因此脚本取该值N°1 列(AGY29650_2_NA,这是一个 ID)中的值和 N°4, 23 列(位置)中的值。 然后脚本搜索将文件二(fasta 文件)中的 ID (AGY29650_2_NA) 与该文件 AGY29650.2 中的 ID 进行匹配,然后查找数据中的位置 23,例如位置 23 中的字母 T:
MTYSVFPLMCLLTFIGANAKIV T LP
然后,脚本打印位置23,左边2个字母,右边2个字母,输出:
IVTLP
脚本不完整,但是,这是我还无法解决的第一个问题。文件之间的 ID 有一些差异,例如:
AGY29650_2_NA (file one) and AGY29650.2 (file two)
为了解决这个问题,同事建议我使用正则表达式来选择每个文件中的 ID,例如:
s/^\s*([^_]+)_([0-9]+)_([a-zA-Z0-9]+)/$1.$2|$3/
我的第二个问题是我无法解决如何将此正则表达式合并到脚本中,我可能在 foreach 循环中思考。 我的第三个问题是一个证书,如果脚本确实在搜索位置(第 N°4 列)并获取相邻的残基(左侧两个字母和右侧两个字母)作为最终输出。 这是不完整的脚本:
use strict;
use warnings;
use Bio::SeqIO;
my $file = $ARGV[0];
my $in = $ARGV[1];
my %fastadata = ();
my @array_residues = ();
my $seqio_obj = Bio::SeqIO->new(-file => $in,
-format => "fasta" );
while (my $seq_obj = $seqio_obj->next_seq ) {
my $dd = $seq_obj->id;
my $ss = $seq_obj->seq;
###my $ee = $seq_obj->desc;
$fastadata{$dd} = "$ss";
}
my $thres = 0.5; ### Selection of values in column N°5 with the following condition: >=0.5
# Open file
open (F, $file) or die; ### open the file or end the analyze
while(my $one = <F>) {### readline => F
$one =~ s/\n//g;
$one =~ s/\r//g;
my @cols = split(/\s+/, $one); ### split columns
next unless (scalar (@cols) == 7); ### the line must have 7 columns to add to the array
my $val = $cols[5];
if ($val >= 0.5) {
my $position = $cols[3];
my $id_list = $cols[0];
if (exists($fastadata{$id_list})) {
my $new_seq = $fastadata{$id_list};
my $subresidues = substr($new_seq, $position -3, 6);
}
}
}
close F;
我正在寻求帮助以将正则表达式合并到脚本中,然后打印我正在寻找的输出。
欢迎任何想法或评论。
最佳答案
未经测试(因为您没有发布 MRE ),但这应该有效:
my $position = $cols[3];
my $id_list = $cols[0];
$id_list =~ s/^\s*([^_]+)_([0-9]+)_([a-zA-Z0-9]+)/$1.$2|$3/; # Add this line
if (exists($fastadata{$id_list})) {
这会修改 $id_list
变量,使其与您的哈希键兼容。
关于regex - 完成在两个文件中搜索并提取数据部分的脚本的想法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67640684/