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

标签 regex perl

我一直在编写一个脚本,该脚本需要两个文件来提取数据的特定部分以创建一个新文件。 如果您想查看完整的文件,请访问以下 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/

相关文章:

java - Java中\b边界匹配器的使用

javascript - 正则表达式,加号与星号

php - 如何检测 URL 中特定页面的存在?

perl - 如何在 perl 脚本中使用 shell 命令结果?

perl - 我在哪里可以阅读 POE(Perl 对象环境)的清晰解释?

php - 返回与 preg_match 的匹配项,不带数字键的项目

asp.net - 检查文本框文本是否为 6 个或更多字符长的 RegularExpressionValidator 上的表达式是什么?

Perl OO 方法调用第一个参数值 (->)

perl - 我如何使用 Perl 的 Getopt::Long 处理 -r=<pattern>?

python - 从 shell 脚本中表的最后一行中提取值