2012-04-12 16 views
5

Używam awk do formatowania pliku wejściowego w pliku wyjściowym. Mam kilka wzorów do wypełnienia zmiennych (np. "Jakiś wzór" w przykładzie). Te zmienne są drukowane w wymaganym formacie w bloku END. Dane wyjściowe muszą być tam wykonane, ponieważ kolejność pojawiania się w pliku wejściowym nie jest gwarantowana, ale kolejność w pliku wyjściowym musi być zawsze taka sama.awk: catch `exit 'w bloku END

BEGIN { 
    FS = "=|," 
} 


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

END { 
    # Output the variables 
    print var 
} 

Więc mój problem jest oświadczenie w strukturze exit. Jeśli wystąpi błąd i zostanie wywołane to polecenie, nie powinno być żadnego wyjścia lub co najwyżej komunikatu o błędzie. Ale jak głosi instrukcja gawk (here), jeśli polecenie exit zostanie wywołane w bloku wzorów, to przynajmniej zostanie wykonany blok END. Czy istnieje jakiś sposób, aby złapać exit jak:

if (!exit_invoked) { 
    print var 
} 

lub jakiś inny sposób, aby uniknąć drukowania wyjście w bloku END?

Stefan

edit: Używany roztwór z shellter.

Odpowiedz

6

będziesz musiał obsługiwać go wyraźnie, ustawiając exit_invoked przed exit linii, tj

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

Mam nadzieję, że to pomaga.

+0

Dziękuję, nie myśl o tym prostym rozwiązaniu;) Spakuję to w funkcję, aby nie zapomnieć zestawu 'exit_invoked'. Stefan – Stefan

+1

@Stefan: Dobry pomysł. Przypominamy, że masz tę zmienną w grze, możesz ustawić ją w bloku BEGIN, tj. 'Exit_invoked = 0'. Niektórzy będą narzekać, że jest to niepotrzebne i zbędne. Sam bym tego nie zrobił, ale jest to dobra technika samokreślania. YRMV. Powodzenia. – shellter

+0

Zrobię to, ponieważ nie piszę programu 'awk' dla siebie. Dzięki. – 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. 

     ...... 
Powiązane problemy