2016-10-31 2 views
1

코딩 노력없이 질문하고 싶습니다. 그러나 그것은 나에게 너무 어려워 보인다. I는 0.5 이하이다 이들 값은, 제 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로 +1합니다.).

감사합니다. 나는 어떤 도움을 주셔서 감사합니다. 고마워요

+0

펄 - if (sprintf ("% f")) : @ list = split (/ list) {@ fields = split (/ \ s + /) , $ fields [1])> 0.5) {print "$ fields [0] \ n";}} 'file1 –

+0

다음 오류를 제공합니다 : –

+0

-e line 1, "] \" 근처에서 연산자가 예상되는 곳에 역 슬래시가 있습니다 \ 연산자 앞에 누락 된 연산자가 있습니까?) "?"근처에 -e 줄 1에 구문 오류가 있습니다. -e line 1, "}}"근처의 구문 오류 컴파일 오류로 인해 -e가 중단되었습니다. –

답변

1

여기에는 하나의 접근 방법이 있습니다. 경우 당신은 내가 새로운 라인을 일치 \r?\n을 사용, 유닉스 시스템에서 DOS 데이터 파일을 것이다, 그래서 모든 경우에 작동합니다

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; 
} 

출력 :

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

brilliant ..이 데이터 세트에서 작동합니다. 그러나 더 큰 파일에서는 다음과 같이 표시됩니다. 3.pl 행 15에서 split에서 초기화되지 않은 값 $ data 사용. 3.pl 행 21의 해시 요소에서 초기화되지 않은 값 $ id 사용. : –

+0

큰 입력 파일이 여기에 있습니다. : https://sites.google.com/site/iicbbioinformatics/share –

+0

흠 .. 큰 파일에 도스 라인 엔딩이 있고 질문에있는 샘플과 약간 다른 형식이있는 것 같습니다. –

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

@ J.Carter 그런 다음 어떻게해야하는지 생각해보십시오. 프로그래머를 고용하거나 .. –

+0

도움을 주셔서 대단히 감사합니다 –