2012-04-12 51 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. 

     ......