2012-04-12 19 views
5

Sto usando awk per la formattazione di un file di input in un file di output. Ho diversi pattern per riempire variabili (come "alcuni pattern" nell'esempio). Queste variabili vengono stampate nel formato richiesto nel blocco END. L'output deve essere eseguito lì perché l'ordine di comparsa nel file di input non è garantito, ma l'ordine nel file di output deve essere sempre lo stesso.awk: catch `exit 'nel blocco END

BEGIN { 
    FS = "=|," 
} 


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

END { 
    # Output the variables 
    print var 
} 

Quindi il mio problema è la dichiarazione exit nel modello. Se c'è qualche errore e questo comando è invocato, non ci dovrebbe essere alcun output o al massimo un messaggio di errore. Ma come dice il manuale di gawk (here), se il comando exit viene richiamato in un blocco di modello, il blocco END verrà eseguito almeno. C'è un modo per prendere il exit come:

if (!exit_invoked) { 
    print var 
} 

o qualche altro modo per evitare la stampa l'uscita nel blocco END?

Stefan

edit: usata la soluzione da Shellter.

risposta

6

dovrete gestire in modo esplicito, impostando exit_invoked prima exit linea, vale a dire

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 
    } 
} 

Spero che questo aiuta.

+0

Grazie, non ho pensato a questa semplice soluzione;) L'ho inserito in una funzione per non dimenticare il set di "exit_invoked'. Stefan – Stefan

+1

@Stefan: buona idea. Come promemoria, che hai in gioco quella variabile, potresti voler impostare il blocco BEGIN, ad esempio exit_invoked = 0'. Alcuni si lamenteranno che non è necessario e ridondante. Non lo farei da solo, ma è una buona tecnica auto-documentante. YRMV. In bocca al lupo. – shellter

+0

Lo farò visto che non scrivo il programma 'awk' da solo. Grazie. – 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. 

     ...... 
Problemi correlati