2012-04-12 43 views
5

我正在使用awk來格式化輸出文件中的輸入文件。我有幾種模式來填充變量(如示例中的「某種模式」)。這些變量在END塊中以所需格式打印。輸出必須在那裏完成,因爲輸入文件中出現的順序不能保證,但輸出文件中的順序必須始終相同。awk:在END塊中捕獲`exit'

BEGIN { 
    FS = "=|," 
} 


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

END { 
    # Output the variables 
    print var 
} 

所以我的問題是模式中的exit聲明。如果有一些錯誤並且調用了該命令,則應該根本沒有輸出或最多有一條錯誤消息。但正如gawk手冊(here)所述,如果exit命令在模式塊中被調用,END塊將至少執行。有沒有辦法趕上exit這樣的:

if (!exit_invoked) { 
    print var 
} 

或一些其他的方式,以避免打印輸出在END塊?

斯特凡

編輯:用於從shellter的解決方案。

回答

6

你必須明確地處理它,由以前exit線設置exit_invoked,即

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

我希望這有助於。

+0

謝謝,不要想到這個簡單的解決方案;)我會把它包裝在一個函數中,不要忘記'exit_invoked'集合。 Stefan – Stefan 2012-04-12 17:51:44

+1

@Stefan:好主意。提醒一下,你有這個變量,你可能想要在BEGIN塊中設置,即'exit_invoked = 0'。有些人會抱怨說這是不必要的和多餘的。我不會自己做,但它是一個很好的自我記錄技術。 YRMV。祝你好運。 – shellter 2012-04-12 17:54:32

+0

我會這樣做,因爲我不爲自己編寫'awk'程序。謝謝。 – Stefan 2012-04-12 17:59:16

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

     ......