2011-02-03 19 views
5
coincidente

Lo siguiente que intento hacer es usar awk. Obtenga la línea que coincida con la expresión regular y la línea inmediatamente anterior a la coincidencia e impresión. Puedo conseguir la línea que coincide con la expresión regular, pero no en la línea inmediatamente antes de que:awk imprimir haciendo coincidir línea y línea antes del

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

Lets líneas supongamos 3 y 4 que coincida con la expresión regular. ¿quieres que aparezca 2,3,4? –

Respuesta

10

En este caso se podría resolver fácilmente con grep:

grep -B1 foo file 

Sin embargo, si necesita utilizar awk:

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

¿Qué tal awk '{if ($ 0 ~ /> /) head = $ 0; getline} {if ($ 0 ~/^ CGCGGCTGCTGG /) cabeza de impresión "\ n" $ 0}' ... ¿es esto correcto? – Sudeep

+0

@Sudeep: puede decirse a sí mismo si es correcto probándolo ... pero es más largo y más difícil de entender que la sugerencia de marco, así que ¿para qué molestarse? – Cascabel

+0

Gracias Jeromi, sí, puedo probar ... Lo estoy, pero Getline era un poco confuso, esta es la razón por la que publiqué para ver si alguien ve el comando y puede levantar la bandera :) – Sudeep

0

Por qué no usar grep -EB1 '^CGCGGCTGCTGG'

El awk para hacer lo mismo es muy largo, ver la respuesta de Marco.

+0

Gracias Marco y Solmojo..grep también funciona, solo menguó en awk. – Sudeep

+0

Como ejercicio de aprendizaje, es una buena cosa que hacer, sin embargo, el grep también se ejecutará más rápido, y en biometría que es probablemente una característica útil. – ocodo

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

su script no manejará correctamente un caso como "bcd \ nabc \ nabcdef" –

+0

Corregido para dar cuenta de eso. –

1

uso de búsqueda del diseño más sencillo

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

0

Tal vez un poco fuera de tema, pero he usado la respuesta de Belisario para crear mi propia variación de la solución anterior, que busca la Nth entrada, y devuelve eso y la línea anterior.

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

Creé el siguiente script awk. Imprime la línea coincidente así como las 2 líneas anteriores. Puede hacerlo más flexible a partir de esta 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; 
      } 
     } 
    } 
} 

de uso:

awk '{print $0}' LogFile.log | awk -f search.awk 
Cuestiones relacionadas