2011-02-03 13 views
5

Di seguito è ciò che sto cercando di fare utilizzando awk. Prendi la linea che corrisponde alla regex e alla linea immediatamente prima della corrispondenza e stampa. Posso ottenere la linea che ha trovato l'espressione regolare, ma non la linea immediatamente prima che:awk stampa la riga e la linea di corrispondenza prima della corrispondenza

awk '{if ($0!~/^CGCGGCTGCTGG/) print $0}' 
+0

Lets linee Supponiamo 3 e 4 partite l'espressione regolare. vuoi mostrare 2,3,4? –

risposta

10

In questo caso si potrebbe facilmente risolvere con grep:

grep -B1 foo file 

Tuttavia, se è necessario utilizzare awk:

awk '/foo/{if (a && a !~ /foo/) print a; print} {a=$0}' file 
+0

Che ne dici di awk '{if ($ 0 ~ /> /) head = $ 0; getline} {if ($ 0 ~/^ CGCGGCTGCTGG /) print head "\ n" $ 0}' .. è corretto ?? – Sudeep

+0

@Sudeep: puoi dire a te stesso se è corretto provandolo ... ma è più lungo e difficile da capire rispetto al suggerimento di Marco, quindi perché preoccuparsi? – Cascabel

+0

Grazie Jeromi, sì, posso testare ... lo sono, ma getline era un po 'confuso, questo è il motivo per cui ho postato per vedere qualcuno che vede il comando e può alzare la bandiera :) – Sudeep

0

perché non utilizzare grep -EB1 '^CGCGGCTGCTGG'

Il awk fare la stessa cosa è molto prolisso, vedi la risposta di Marco.

+0

Grazie anche a Marco e Solmojo..grep, è appena finito di fare in awk. – Sudeep

+0

Come esercizio di apprendimento, è una buona cosa da fare, tuttavia, grep funzionerà anche più velocemente, e su dati biometrici è probabilmente una caratteristica utile. – ocodo

2
/abc/{if(a!="")print a;print;a="";next} 
{a=$0} 
+0

il tuo script non gestirà correttamente un caso come "bcd \ nabc \ nabcdef" –

+0

corretto per questo. –

1

uso ricerca del modello più semplice

gawk '{if (/^abc$/) {print x; print $0};x=$0}' file1 > file2

0

Forse un po 'off-topic, ma ho usato la risposta da Belisario a creare la mia propria variazione della soluzione di cui sopra, che cerca la numero, e restituisce quello e la riga precedente.

awk -v count=1 '/abc/{{i++};if(i==count){print a;print;exit}};{a=$0}' file 
1

Ho creato il seguente script awk. Stampa la riga corrispondente e le 2 righe precedenti. Puoi renderlo più flessibile da questa idea.

search.awk

{ 
    a[0]=$0; 
    for(i=0;i<2;i++) 
    { 
     getline; 
     if(i==0){ 
      a[1]=$0; 
     } 
     if(i==1){ 
      if($0 ~ /message received/){ 
       print a[0];  
       print a[1]; 
       print $0; 
      } 
     } 
    } 
} 

utilizzo:

awk '{print $0}' LogFile.log | awk -f search.awk 
Problemi correlati