2016-08-11 16 views
0

input.txt:AWK - bekommen Wert zwischen zwei Strings über mehrere Zeilen

>block1 
111111111111111111111 
>block2 
222222222222222222222 
>block3 
333333333333333333333 

AWK Befehl:

awk '/>block2.*>/' input.txt 

Erwartete Ausgabe

222222222222222222222 

jedoch AWK kehrt nichts. Was verstehe ich falsch?

Danke!

+1

Es gibt keine Linie ist enthalten ' > block2> 'in Ihrer Eingabe, so dass nichts gedruckt werden konnte. –

+0

Es gibt mehrere Duplikate wie http://stackoverflow.com/questions/34670874/how-to-extract-fasta-sequence-using-sequence-id-shell-script, obwohl diejenigen, die ich schnell finden könnte alle die> Header enthalten würden Linie in der Ausgabe. Dies zu ändern sollte sowieso trivial sein. – tripleee

+0

Warum sollte die Ausgabe '222222' von einem Muster erwartet werden, das eine nicht optionale Übereinstimmung für' block2' enthält und keine Bearbeitung auf den übereinstimmenden Text angewendet wird? Erwarten Sie, dass 'grep X'' Y' ausgibt? – Kaz

Antwort

2

Wenn Sie die Zeile nach der Zeile mit >block2 ausdrucken möchten, dann können Sie verwenden:

awk '/^>block2$/ { nr=NR+1 } NR == nr { print }' 

Verfolgen Sie die Datensatznummer plus 1, wenn Sie das Spiel zu finden; Wenn die aktuelle Datensatznummer mit der gespeicherten übereinstimmt, drucken Sie den aktuellen Datensatz.

Wenn Sie alle Zeilen zwischen der Zeile wollen >block2 und >block3, dann würden Sie verwenden:

awk '/^>block2$/,/^>block3/ {if ($0 !~ /^>block[23]$/) print }' 

Für alle Linien zwischen den beiden Markierungen, wenn die Linie es nicht so oder Marker übereinstimmen, drucken . Die Ausgabe ist mit der Beispieldatendatei identisch.

2

andere awk

$ awk 'c&&c--; /^>block2/{c=1}' file 
222222222222222222222 

c gibt an, wie viele Zeilen, die Sie nach dem Spiel drucken möchten. Wenn Sie den Text zwischen zwei Markern

$ awk '/^>block3/{exit} s; /^>block2/{s=1}' file 
222222222222222222222 

, wenn mehrere Instanzen sind und Sie wollen, dass sie alle, nur exit zu s=0 Sie

0

ändern wahrscheinlich gemeint:

$ awk '/>/{f=/^>block2$/;next} f' file 
222222222222222222222 
Verwandte Themen