2016-12-04 2 views
0

Ich habe eine Datei wie das kleine Beispiel: kleines Beispiel:proble mit Filtern einige Teile Textdatei in bash

>ENSG00000004142|ENST00000003607|POLDIP2|||2118 
Sequence unavailable 
>ENSG00000003056|ENST00000000412|M6PR|9099001;9102084|9099001;9102551|2756 
CCAGGTTGTTTGCCTCTGGTCGGAAAGGGAAACTACCCCTGCTTCCACTCTGACAGCAGA 

aber ich habe zu viele „Sequence nicht verfügbar“. Ich möchte diese Transkripte loswerden. und die Ergebnisse würden so aussehen:

>ENSG00000003056|ENST00000000412|M6PR|9099001;9102084|9099001;9102551|2756 
CCAGGTTGTTTGCCTCTGGTCGGAAAGGGAAACTACCCCTGCTTCCACTCTGACAGCAGA 

Ich habe versucht, die Teile in bash auszufiltern mit

grep -A 2 "Sequence" your.fa | grep -v "\-\-" | sed -n '/Sequence/!p' > new.fa 

aber es entfernt nur „Sequence nicht verfügbar“, aber nicht seine Header (die Zeile beginnt mit ">" über jeder Sequenz, die Kennung für jede Sequenz ist)

Wie kann ich sie in bash oder Python herausfiltern?

+0

Wenn Sie die ganze Zeile entfernen möchten, verwenden Sie 'grep -v 'Sequence unavailable" '. – Robert

+0

mit dem erwähnten Code kann ich die ganze Zeile entfernen. aber ich möchte auch die obige Zeile entfernen, die ihre Kennung ist. – user7249622

+0

Wird es immer eine Zeile über "Sequenz nicht verfügbar" geben, die entfernt werden muss? – andlrc

Antwort

2

die Zeile mit Sequence unavailable Unter der Annahme, als auch die Zeile oberhalb entfernt werden sollte, kann man verwenden, um dies Sed:

$ sed '$!N;/\nSequence unavailable$/d;P;D' input 

Grundsätzlich funktioniert es durch Lesen zwei Linien in den Musterraum zu der Zeit, dann wird der Druck oben ein, und aus dem Musterraum zu entfernen, so dass die aktuelle Zeile im Musterbereich zu verlassen, die in immer führen eine Reihe hinter sein:

$!N;        # Append Next line to pattern space unless 
            # there are no more lines 
    /\nSequence unavailable$/d  # Delete whole pattern space if regex is matched 
           P; # Print first line of pattern space 
           D # Delete first line of pattern space 

die oben genannten Arbeiten in GNU sed, könnte man brauchen ;D zu ändern zum ;$!D;q um mit einem streng POSIX sed zu arbeiten oder man hätte eine Endlosschleife.

Verwandte Themen