2016-10-31 4 views
1

コーディングの労力を必要とせずに質問してくださいしかし、それはあまりにも難しいようです。私はタブ付きデータファイルのように、3つのデータ列(およびいくつかの反復ヘッダ行を)分離有する複数列のファイルの比較と範囲の抽出

:0.5以上であるそれらの値(S)のための第2のデータ列から

Sequence ../Output/yy\Programs\NP_416485.4 alignment. Using default output format... 
# ../Output/Split_Seq/NP_415931.4.fasta -- js_divergence - window_size: 3 
# jjhgjg cstr score 

0 0.89 u-p 
1 -5.79 --- 
2 0.85 yui 
3 0.51 uio 
4 0.66 -08 
Sequence ../Output/yy\Programs\YP_986467.7 alignment. Using default output format... 
# ../Output/Split_Seq/YP_986467.7.fasta -- js_divergence - window_size: 3 
# jjhgjg cstr score 

0 0.001 -s- 
1 0.984 --- 
2 0.564 -fg 
3 0.897 -sr 

、Iは対応する最初の列番号(または範囲)を抽出します。

上記入力の場合、出力は以下のようになり:ここ

NP_416485.4: 1, 3-5 
YP_986467.7: 2-4 

は、 "NP_416485.4" および "YP_986467.7" は(\プログラム後)ヘッダ記述子からです。 (例えば、NP_416485.4の実際の値は、 "NP_416485.4:0,2-4"でなければならないが、0から始めるのではなく、すべて+1で増やす)。

ありがとうございました。助けていただければ幸いです。ありがとう

+0

perlの - if(sprintf( "%f")); if(undefined $ /; $ content = ; @ list = split(/ \ n /、$ content) 、$ fields [1])> 0.5){print "$ fields [0] \ n";}} 'file1 –

+0

これらのエラーには、 –

+0

オペレータが-e line 1、 "] \" \の前に演算子がありません) "?"に近い-e行1の構文エラー -e line 1、 "}}"の構文エラー " コンパイルエラーのために-eが実行されました。 –

答えて

1

これは1つのアプローチです。

use feature qw(say); 
use strict; 
use warnings; 

my $file_name = 'input.txt'; 
open (my $fh, '<', $file_name) or die "Could not open file '$file_name': $!"; 
my $str = do { local $/; <$fh> }; 
close $fh; 

my @chunks = $str =~ /(Sequence(?:.(?!Sequence))*)/sg; 
my %ids; 
for my $cstr (@chunks) { 
    my ($id, $data) = $cstr 
     =~/Split_Seq\/(\S+)\.fasta.*?\r?\n\r?\n(.*)$/s; 
    my @lines = split /\n/, $data; 
    my @vals; 
    for my $line (@lines) { 
     my @fields = split " ", $line; 
     push (@vals, $fields[0] + 1) if $fields[1] > 0.5; 
    } 
    $ids{$id} = \@vals; 
} 

for my $id (keys %ids) { 
    my @tmp = sort { $a <=> $b } @{ $ids{$id} }; 
    my ($first, $last); 
    my @rr; 
    for my $i (0..$#tmp) { 
     if ($i == 0) { 
      $first = $tmp[0]; 
      $last = undef; 
     } 
     if ($i < $#tmp && ($tmp[$i] == ($tmp[$i+1] - 1))) { 
      $last = $tmp[$i+1]; 
      next; 
     } 
     if (defined $last) { 
      push @rr, "$first-$last"; 
      $last = undef; 
     } 
     else { 
      push @rr, $tmp[$i]; 
     } 
     $first = ($i < $#tmp) ? $tmp[$i+1] : undef; 
    } 
    say "$id: ", join ",", @rr; 
} 

出力:それはすべてのケースのために動作しますので、あなたはUnixマシン上のDOSデータファイルを持っているでしょう場合、私は、新しい行を一致させるために\r?\nを使用

NP_416485.4: 1,3-5 
YP_986467.7: 2-4 
+0

これは素晴らしいデータセットです。より大きなファイルでは、次のように表示されます。3.pl行15でsplitで初期化されていない値$ dataを使用する。 3.pl行21のハッシュ要素で初期化されていない値$ idを使用する。 : –

+0

大きな入力ファイルがここにある:https://sites.google.com/site/iicbbioinformatics/share –

+0

Hmm ..あなたの大きなファイルのように、DOS行の終わりがあり、あなたの質問のサンプルと少し異なった書式を持っているようです。 –

1

あなたは本当にあなたの問題の良い説明を与えていない、あなたはそれをあなた自身で解決するために何も努力していないが、ここであなたの問題の最初の部分(ファイルをデータ構造)。 %resultsハッシュを歩き、必要な出力を生成する必要があります。

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

use Data::Dumper; 
my %results; 
my $section; 

while (<DATA>) { 
    # Look for a new section 
    if (/\\Programs\\(\S+)\s/) { 
    $section = $1; 
    } 

    # Look for data lines 
    if (/^\d\b/) { 
    my @data = split; 
    if ($data[1] > 0.5) { 
     push @{$results{$section}}, $data[0] + 1; 
    } 
    } 
} 

say Dumper \%results; 

__DATA__ 
Sequence ../Output/yy\Programs\NP_416485.4 alignment. Using default output format... 
# ../Output/Split_Seq/NP_415931.4.fasta -- js_divergence - window_size: 3 
# jjhgjg cstr score 

0 0.89 u-p 
1 -5.79 --- 
2 0.85 yui 
3 0.51 uio 
4 0.66 -08 
Sequence ../Output/yy\Programs\YP_986467.7 alignment. Using default output format... 
# ../Output/Split_Seq/YP_986467.7.fasta -- js_divergence - window_size: 3 
# jjhgjg cstr score 

0 0.001 -s- 
1 0.984 --- 
2 0.564 -fg 
3 0.897 -sr 
+0

ありがとうございます。しかし、私はこれらの出力値を範囲に変換する方法がわからないことを恐れています。ごめんなさい。 –

+0

@JCarterそれでは、どうやってそれを行う必要があると思います。プログラマーを雇うか、 –

+0

助けてくれてありがとう –

関連する問題