2012-04-12 12 views
5

Estoy usando awk para formatear un archivo de entrada en un archivo de salida. Tengo varios patrones para llenar variables (como "algún patrón" en el ejemplo). Estas variables se imprimen en el formato requerido en el bloque END. La salida debe realizarse allí porque el orden de aparición en el archivo de entrada no está garantizado, pero el orden en el archivo de salida debe ser siempre el mismo.awk: catch `exit 'en el bloque END

BEGIN { 
    FS = "=|," 
} 


/some pattern/ { 
    if ($1 == 8) { 
     var = $1 
    } else { 
     # Incorrect field value 
     exit 1 
    } 
} 

END { 
    # Output the variables 
    print var 
} 

Así que mi problema es la declaración exit en el patrón. Si hay algún error y se invoca este comando, no debería haber ningún resultado o, como máximo, un mensaje de error. Pero como dice el manual de gawk (here), si se invoca el comando exit en un bloque de patrón, se ejecutará al menos el bloque END. ¿Hay alguna manera de coger el exit como:

if (!exit_invoked) { 
    print var 
} 

o alguna otra forma de evitar la impresión de la salida en el bloque END?

Stefan

edición: Se utiliza la solución de Shellter.

Respuesta

6

tendrá que manejarlo de forma explícita, mediante el establecimiento de exit_invoked antes exit línea, es decir

BEGIN { 
    FS = "=|," 
} 


/some pattern/ { 
    if ($1 == 8) { 
     var = $1 
    } else { 
     # Incorrect field value 
     exit_invoked=1 
     exit 1 
    } 
} 

END { 
    if (! exit_invoked ) { 
     # Output the variables 
     print var 
    } 
} 

espero que esto ayude.

+0

Gracias, no pensé en esta simple solución;) Voy a empaquetar esto en una función para no olvidar el conjunto 'exit_invoked'. Stefan – Stefan

+1

@Stefan: Buena idea. Como recordatorio de que tiene esa variable en juego, es posible que desee establecer en el bloque BEGIN, es decir, 'exit_invoked = 0'. Algunos se quejarán de que es innecesario y redundante. No lo haría yo mismo, pero es un buen techinque de auto-documentación. YRMV. Buena suerte. – shellter

+0

Haré esto ya que no escribo el programa 'awk' para mí. Gracias. – Stefan

-2
END { 
     # If here from a main block exit error, it is unlikely to be at EOF 
     if (getline) exit 
     # If the input can still be read, exit with the previously set status rather than run the rest of the END block. 

     ...... 
Cuestiones relacionadas