gpt4 book ai didi

regex - 完成一个脚本在两个文件中搜索并提取一段数据的想法

转载 作者:行者123 更新时间:2023-12-04 07:38:08 25 4
gpt4 key购买 nike

我一直在做一个脚本,它需要两个文件来提取数据的特定部分以创建一个新文件。
如果你想查看完整的文件,这里有一个 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(位置)中的值。
然后脚本搜索文件 2(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com