2014-09-27 2 views
0

awk/sed/perl 전문가 모두에게 질문이 있습니다. 나는 다음과 같은 형식의 예를 가진 파일을 발견 :동일한 문자열을 가진 x 개의 항목을 삭제하고 수정 된 헤더가있는 항목을 하나만 유지하는 방법은 무엇입니까?

>GALHOMG00000016026_1 GALHOMT00000016026_1 GALHOMP00000016026_1 JH556633.1:35740-45316 1 
MPKKKTGARKKAENRREREKQIRASRANIDLAKHPCNASMECDKCQRRQKNRAFCYFCNS 
VQKLPICAQCGKTKCMMKSSDCVIKHAGVYSTGLAMVGAICDFCEAWVCHGRKCLSTHAC 
TCPLADAECIECERSVWDHGGRIFACSFCHDFLCEDDQFEHQASCQVLEAETFKCVSCNR 
LGQHSCLRCKACFCGDHVRSKVFKQEKGKEPPCPKCGHETQQTKDLSMSTRSLKFGRQTG 
GEDADGASGYDAYWKNLSSSKPGDAGDREDEYDEYEAEDDDEDDNDEGGKDSDTETTDLF 
SNLNLGRTYASGYAHYEEPED 

>HUMHOMG00000262990_1 HUMHOMT00000262990_1 HUMHOMP00000262990_1 JH556633.1:35740-45316 1 
MPKKKTGARKKAENRREREKQIRASRANIDLAKHPCNASMECDKCQRRQKNRAFCYFCNS 
VQKLPICAQCGKTKCMMKSSDCVIKHAGVYSTGLAMVGAICDFCEAWVCHGRKCLSTHAC 
TCPLADAECIECERSVWDHGGRIFACSFCHDFLCEDDQFEHQASCQVLEAETFKCVSCNR 
LGQHSCLRCKACFCGDHVRSKVFKQEKGKEPPCPKCGHETQQTKDLSMSTRSLKFGRQTG 
GEDADGASGYDAYWKNLSSSKPGDAGDREDEYDEYEAEDDDEDDNDEGGKDSDTETTDLF 
SNLNLGRTYASGYAHYEEPED 

>TGUHOMG00000002432_1 TGUHOMT00000002432_1 TGUHOMP00000002432_1 JH556633.1:35740-45316 1 
MPKKKTGARKKAENRREREKQIRASRANIDLAKHPCNASMECDKCQRRQKNRAFCYFCNS 
VQKLPICAQCGKTKCMMKSSDCVIKHAGVYSTGLAMVGAICDFCEAWVCHGRKCLSTHAC 
TCPLADAECIECERSVWDHGGRIFACSFCHDFLCEDDQFEHQASCQVLEAETFKCVSCNR 
LGQHSCLRCKACFCGDHVRSKVFKQEKGKEPPCPKCGHETQQTKDLSMSTRSLKFGRQTG 
GEDADGASGYDAYWKNLSSSKPGDAGDREDEYDEYEAEDDDEDDNDEGGKDSDTETTDLF 
SNLNLGRTYASGYAHYEEPED 

나는 다음에이 파일을 수정하고 싶습니다 :

>JH556633.1:35740-45316 
MPKKKTGARKKAENRREREKQIRASRANIDLAKHPCNASMECDKCQRRQKNRAFCYFCNS 
VQKLPICAQCGKTKCMMKSSDCVIKHAGVYSTGLAMVGAICDFCEAWVCHGRKCLSTHAC 
TCPLADAECIECERSVWDHGGRIFACSFCHDFLCEDDQFEHQASCQVLEAETFKCVSCNR 
LGQHSCLRCKACFCGDHVRSKVFKQEKGKEPPCPKCGHETQQTKDLSMSTRSLKFGRQTG 
GEDADGASGYDAYWKNLSSSKPGDAGDREDEYDEYEAEDDDEDDNDEGGKDSDTETTDLF 
SNLNLGRTYASGYAHYEEPED 

나는 내가 내 말은 (헤더를 부르는 수정할 수 있다는 사실을 알고 > 다음에 나오는 줄) :

awk 'NF > 1{$0=">"$4}; {print $0}' file.fa > file2.fa 

내 질문은 두 개의 다른 단락을 어떻게 삭제합니까? 단락의 문자 순서 (즉, 헤더 행을 세지 않음)가 동일하지 않은 인스턴스가 파일에있을 수 있습니다. 이 경우 같은 식별자가있는 항목 수를 기준으로 확장명을 추가하고 싶습니다 (예 :이 경우 JH556633.1-2:35740-45316의 경우 JH556633.1-1:35740-45316 또는 이와 유사한 경우). 요점은 동일한 헤더 (>으로 시작하는 행)가 다르지만 동일하지 않은 경우 문자의 원래 순서를 유지하는 것입니다.

누구든지이 문제를 해결할 생각이 있다면 도움을 주시면 감사하겠습니다. 감사!

+0

좋아을 ! 알았다! – BashN3wb

+0

'보다 큼 기호'가있는 행 또는'보다 큼 기호 '로 시작하는 행 뒤의 행을 의미합니까? –

+0

문제를 해결하려는 시도를 보여주십시오 (게시 한 awk 명령뿐만 아니라 첫 번째 줄만 처리). –

답변

1

이 방법이 유용 할 것입니다. 모든 시퀀스 파일이 그 시퀀스를 가지기 때문에 다른 시퀀스 간의 빈 줄에 의존하지 않습니다. 각 ID에 을 추가합니다. 여기서 N은 ID가 발견 된 횟수입니다. 단일 시퀀스에만 연결된 ID는 _1입니다. ID가 여러 개의 다른 순서와 연관되어 있으면 이러한 모든 순서가 인쇄됩니다.

#!/usr/bin/env perl 
use strict; 
use warnings; 

## The field of the ID line you want to keep. 
## Since we start counting from 0, to get the 4th 
## field, set this to 3. 
my $want=3; 

my (@fields,%seqs,%seen,$seq); 
## Read the input file 
while (<>) { 
    ## Skip blank lines 
    next if /^\s*$/; 
    ## remove trailing newlines 
    chomp; 
    ## Is this an ID line? 
    if (/^\s*>(.*)/) { 
     ## Save the previous sequence (if any). The %seqs 
     ## hash has the sequence as a key and the desired 
     ## ID as a value. 
     if ($fields[0]) { 
      $seqs{$seq}=$fields[$want];     
      ## Clear the previous sequence and IDs 
      $seq=""; 
      @fields=(); 
     } 
     ## Split the ID fields into @fields. 
     @fields=split(/\s+/); 
    } 
    ## If this is a sequence, add to $seq 
    else { 
     $seq.=$_; 
    } 
} 
## Get the last sequence 
$seqs{$seq}=$fields[$want];     

foreach my $sequence (sort keys(%seqs)) { 
    ## Add an identifier. 
    $seen{$seqs{$sequence}}++; 
    print ">$seqs{$sequence}_$seen{$seqs{$sequence}}\n"; 
    ## Convert the sequence back to FASTA 
    $sequence=~s/(.{60})/$1\n/g; 
    print "$sequence\n"; 
} 

저장 foo.pl 같은 스크립트 또는 무엇 이건, chmod 744 foo.pl를 그것을 실행하게하고 실행 샘플을 기반으로

$ ./foo.pl file.fa 
>JH556633.1:35740-45316_1 
MPKKKTGARKKAENRREREKQIRASRANIDLAKHPCNASMECDKCQRRQKNRAFCYFCNS 
VQKLPICAQCGKTKCMMKSSDCVIKHAGVYSTGLAMVGAICDFCEAWVCHGRKCLSTHAC 
TCPLADAECIECERSVWDHGGRIFACSFCHDFLCEDDQFEHQASCQVLEAETFKCVSCNR 
LGQHSCLRCKACFCGDHVRSKVFKQEKGKEPPCPKCGHETQQTKDLSMSTRSLKFGRQTG 
GEDADGASGYDAYWKNLSSSKPGDAGDREDEYDEYEAEDDDEDDNDEGGKDSDTETTDLF 
SNLNLGRTYASGYAHYEEPED 
0

(그것이 사소한 팅겨이야 할 수 있다면) 귀하의 게시 입력 당 & 또는 \<digit>를 포함 할 수 없습니다 $4 가정 :

$ awk -v RS= '!seen[$4]++{sub(/[^\n]+/,$4);print}' file 
JH556633.1:35740-45316 
MPKKKTGARKKAENRREREKQIRASRANIDLAKHPCNASMECDKCQRRQKNRAFCYFCNS 
VQKLPICAQCGKTKCMMKSSDCVIKHAGVYSTGLAMVGAICDFCEAWVCHGRKCLSTHAC 
TCPLADAECIECERSVWDHGGRIFACSFCHDFLCEDDQFEHQASCQVLEAETFKCVSCNR 
LGQHSCLRCKACFCGDHVRSKVFKQEKGKEPPCPKCGHETQQTKDLSMSTRSLKFGRQTG 
GEDADGASGYDAYWKNLSSSKPGDAGDREDEYDEYEAEDDDEDDNDEGGKDSDTETTDLF 
SNLNLGRTYASGYAHYEEPED 

그것은 당신이 다른 질문을 가지고있는 것처럼 너무 너무 일부 대표와 새 질문을 게시 보인다 그 질문에 대한 입력 및 예상 출력.

0
sed -n 's/^>\([^ ]\{1,\} \)\{3\}/>/;/^ *$/q;p' YourFile 

(POSIX 버전 나오지 GNU에 이렇게 --posix)

관련 문제