首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配字符串和子字符串

匹配字符串和子字符串
EN

Stack Overflow用户
提问于 2016-08-08 18:26:50
回答 1查看 65关注 0票数 0

我正在处理一个目录(Linux服务器)中的多个vcf文件,以及一个包含示例名称和相应条形码的选项卡分隔的密钥文件。

以下是文件的命名方式:

代码语言:javascript
复制
RA_4090_v1_RA_4090_RNA_v1.vcf
RA_4090_dup_v1_RA_4090_dup_RNA_v1.vcf
RA_565_v1.vcf
RA_565_dup_v1.vcf
RA_HCC-78-2.vcf

以下是密钥文件的内容:

代码语言:javascript
复制
Barcode ID      Sample Name
IonSelect-2     RA_4090
IonSelect-4     RA_565
IonSelect-6     RA_HCC-78-2
IonSelect-10    RA_4090_dup
IonSelect-12    RA_565_dup

我需要将正确的示例名称与每个.vcf文件关联起来,然后重命名每个.vcf文件。

每个示例总是有一个vcf文件。但是,有时示例名称以相同的子字符串开头,并且不可能正确匹配它们,因为示例名称没有标准化。

以下代码在示例名称不同时运行良好,但如果多个示例名称以相同的子字符串开头,则会失败。我不知道如何解释使用同一个子字符串乞求的多个示例名称。

请提出一些有用的建议。以下是当前代码:

代码语言:javascript
复制
#!/usr/bin/perl
use warnings;
use strict;
use File::Copy qw(move);

my $home="/data/";                                                     
my $bam_directory = $home."test_all_runs/".$ARGV[0];

my $matrix_key = $home."test_all_runs/".$ARGV[0]."/key.txt";

my @matrix_key = ();

open(TXT2, "$matrix_key") or die "Can't open '$matrix_key': $!";
        while (<TXT2>){  
                push (@matrix_key, $_);   
                }
close(TXT2);

my @ant_vcf = glob "$bam_directory/*.vcf";

for my $tsv_file (@ant_vcf){

        my $matrix_barcode_vcf = "";
        my $matrix_sample_vcf = "";

        foreach (@matrix_key){
                chomp($_);
                my @matrix_key = split ("\t", $_);##  
                if (index ($tsv_file,$matrix_key[1]) != -1) {
                  $matrix_barcode_vcf = $matrix_key[0]; print $matrix_key[0];
                  $matrix_sample_vcf = $matrix_key[1];
                  chomp $matrix_barcode_vcf;
                  chomp $matrix_sample_vcf;
                  #print $bam_directory."/".$matrix_sample_id."_".$matrix_barcode.".bam";
                  move $tsv_file, $bam_directory."/".$matrix_sample_vcf."_".$matrix_sample_vcf.".vcf";
                }       
        }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-08 19:48:36

以下代码在示例名称不同时运行良好,但如果多个示例名称以相同的子字符串开头,则会失败。我不知道如何解释使用同一个子字符串乞求的多个示例名称。

解决问题的关键是按照长度-最长的第一位对“示例名称”进行排序。

例如,MATCHES RA_4090_dup应该位于@matrix_key数组中的MATCHES RA_4090之前,因此它将尝试首先匹配较长的字符串。然后,在匹配之后,停止搜索(我使用了来自first模块的List::Util模块,该模块从5.08版本开始就成为核心perl的一部分)。

代码语言:javascript
复制
#!/usr/bin/perl
use strict;
use warnings;
use List::Util 'first';

my @files = qw(
RA_4090_v1_RA_4090_RNA_v1.vcf
RA_4090_dup_v1_RA_4090_dup_RNA_v1.vcf
RA_565_v1.vcf
RA_565_dup_v1.vcf
RA_HCC-78-2.vcf
);

open my $key, '<', 'junk.txt' or die $!; # key file

<$key>; # throw away header line in key file (first line)

my @matrix_key = sort {length($b->[1]) <=> length($a->[1])} map [ split ],  <$key>;
close $key or die $!;

for my $tsv_file (@files) {
    if ( my $aref = first { index($tsv_file, $_->[1]) != -1 } @matrix_key ) {
        print "$tsv_file \t MATCHES $aref->[1]\n";
        print "\t$aref->[1]_$aref->[0]\n\n";    
    }
}

这就产生了这样的产出:

代码语言:javascript
复制
RA_4090_v1_RA_4090_RNA_v1.vcf    MATCHES RA_4090
        RA_4090_IonSelect-2

RA_4090_dup_v1_RA_4090_dup_RNA_v1.vcf    MATCHES RA_4090_dup
        RA_4090_dup_IonSelect-10

RA_565_v1.vcf    MATCHES RA_565
        RA_565_IonSelect-4

RA_565_dup_v1.vcf        MATCHES RA_565_dup
        RA_565_dup_IonSelect-12

RA_HCC-78-2.vcf          MATCHES RA_HCC-78-2
        RA_HCC-78-2_IonSelect-6
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38836083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档