2016-08-08 27 views
0

私はディレクトリ(Linuxサーバー)内の複数のvcfファイルと、サンプル名と対応するバーコードを含むタブ区切りのキーファイルを扱っています。ここで部分文字列と一致する文字列

は、ファイルの名前の付け方である:ここでは

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 

は、キーファイルの内容は以下のとおりです。

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ファイル

各サンプルには常に1つのvcfファイルがあります。ただし、サンプル名が同じ部分文字列で始まる場合があり、サンプル名が標準化されていないため、正しく一致させることは不可能です。

次のコードは、サンプル名が異なる場合は正常に動作しますが、複数のサンプル名が同じ部分文字列で始まる場合は失敗します。私は同じサブストリングで懇願している複数のサンプル名をどのように考慮するか考えていません。

問題のないことをご提案ください。ここでは、現在のコードは次のとおりです。

#!/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"; 
       }  
     } 

} 

答えて

1

サンプル名が異なっているが、複数のサンプル名が同じ部分で始まる場合には失敗したときに、次のコードはうまく動作します。私は同じサブストリングで懇願している複数のサンプル名をどのように考慮するか考えていません。

問題を解決するための鍵は、「サンプル名」の名前を長さ順にソートすることです。

たとえば、MATCHES RA_4090_dupは、@matrix_key配列のMATCHES RA_4090より前である必要があります。したがって、長い文字列を最初に一致させようとします。その後、一致した後、検索を停止します(私はList::Utilモジュールからfirstを使用しました。これは、バージョン5.08以降のコアperlの一部です)。

#!/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";  
    } 
} 

これは、この出力を生成:

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 
+0

これは素晴らしいです!どうもありがとうございました! – user3781528

関連する問題