2013-01-11 5 views
0

필자는 지금까지 필자가 사용한 적이 있기 때문에 파이썬과 perl에 태그를 붙였습니다. 누구든지 이것에 대해 갈 수있는 더 좋은 방법을 알고 있다면 분명히 그것을 시도해 볼 것입니다. 어쨌든, 내 문제 :파일에서 특정 데이터 추출 및 다른 파일에 쓰기

서열 번호가 geneID과 오른쪽에있는 숫자입니다
seq1 5 15 
seq1 20 34 

seq2 50 48 
seq2 45 36 

seq3 17 20 

이의 위치입니다

나는 다음과 같은 형식을 따르는 유전자 예측 프로그램의 입력 파일을 작성해야 엑슨은 오픈 리딩 프레임 안에있다. 이제는 다른 정보가 많은 .gff3 파일에이 정보가 있습니다. 비 관련 데이터가 포함 된 열을 쉽게 Excel에서 열 수 있습니다. 여기에 지금 정돈 방법은 다음과 같습니다

PITG_00002 . gene 2 397 . + . ID=g.1;Name=ORF% 
PITG_00002 . mRNA 2 397 . + . ID=m.1; 
**PITG_00002** . exon **2 397** . + . ID=m.1.exon1; 
PITG_00002 . CDS 2 397 . + . ID=cds.m.1; 

PITG_00004 . gene 1 1275 . + . ID=g.3;Name=ORF%20g 
PITG_00004 . mRNA 1 1275 . + . ID=m.3; 
**PITG_00004** . exon **1 1275** . + . ID=m.3.exon1;P 
PITG_00004 . CDS 1 1275 . + . ID=cds.m.3;P 

PITG_00004 . gene 1397 1969 . + . ID=g.4;Name= 
PITG_00004 . mRNA 1397 1969 . + . ID=m.4; 
**PITG_00004** . exon **1397 1969** . + . ID=m.4.exon1; 
PITG_00004 . CDS 1397 1969 . + . ID=cds.m.4; 

그래서 내가 굵은 글씨로 데이터 만 필요합니다. 예 :

PITG_0002 2 397 

PITG_00004 1 1275 
PITG_00004 1397 1969 

감사의 말을 전하면됩니다.

편집 : 음, 나는 형식을 엉망으로 만들었습니다. ** 사이에있는 것은 무엇이든 내가 권자가 필요한 것입니다. 보행자

답변

1

그것은처럼 보이는 당신의 데이터는 탭으로 구분됩니다.

이 Perl 프로그램은 세 번째 열에 exon이있는 모든 레코드에서 1, 4 및 5 열을 인쇄합니다. open 문에서 파일 이름을 실제 파일 이름으로 변경해야합니다. 모든 답변을

use strict; 
use warnings; 

open my $fh, '<', 'genes.gff3' or die $!; 

while (<$fh>) { 
    chomp; 
    my @fields = split /\t/; 
    next unless @fields >= 5 and $fields[2] eq 'exon'; 
    print join("\t", @fields[0,3,4]), "\n"; 
} 

출력

PITG_00002 2 397 
PITG_00004 1 1275 
PITG_00004 1397 1969 
+0

감사합니다. 이것은 특히 잘 작동했습니다. 나는 궁금해했다. 다른 유전자의 엑손 사이에 공간을 두는 방법이 있을까?예를 들어, PITG_00004가 여분의 라인없이 함께 그룹 지어 지지만 PITG_00002와 PITG_00004 사이에 여분의 라인이있을 것입니다. – user1784467

1

:

(이것은 파이썬입니다)

with open(data_file) as f: 
    for line in f: 
     tokens = line.split() 
     if len(tokens) > 3 and tokens[2] == 'exon': 
      print tokens[0], tokens[3], tokens[4] 

유닉스에서

PITG_00002 2 397 
PITG_00004 1 1275 
PITG_00004 1397 1969 
2

를 인쇄하는 :

grep <file.gff3 " exon " | 
    sed "s/^\([^ ]+\) +[.] +exon +\([0-9]+\) \([0-9]+\).*$/\1 \2 \3/" 
0

여기에 펄 스크립트 옵션 perl scriptName.pl file.gff3입니다 :

use strict; 
use warnings; 

while (<>) { 
    print "@{ [ (split)[ 0, 3, 4 ] ] }\n" if /exon/; 
} 

출력 :

PITG_00002 2 397 
PITG_00004 1 1275 
PITG_00004 1397 1969 

또는 다음 다만 수 :

perl -n -e 'print "@{ [ (split)[ 0, 3, 4 ] ] }\n" if /exon/' file.gff3 

파일에 데이터를 저장하려면 :

use strict; 
use warnings; 

open my $inFH, '<', 'file.gff3' or die $!; 
open my $outFH, '>>', 'data.txt' or die $!; 

while (<$inFH>) { 
    print $outFH "@{ [ (split)[ 0, 3, 4 ] ] }\n" if /exon/; 
} 
관련 문제