如果不匹配则打印awk

时间:2013-06-12 00:42:19

标签: regex sed awk

我在awk中使用以下语句,其中包含来自另一个命令的文本:

awk 'match($0,/(QUOTATION|TAX INVOICE|ADJUSTMENT NOTE|DELIVERY DOCKET|PICKING SLIP|REMITTANCE ADVICE|PURCHASE ORDER|STATEMENT)/) && NR<11 {print substr($0,RSTART,RLENGTH)}'

这几乎可以满足我的需要(在输入的前10行中找到正则表达式中的一个单词并打印该单词)。我需要做的主要是在没有匹配的情况下输出一些东西。例如,如果在前十行中找不到这些单词,则输出UNKNOWN

我还需要将输出限制为第一个匹配,因为我需要确保每个输入文件的单行输出。我可以使用head执行此操作或在需要时提出另一个问题,我只在此处包含它,以防它影响如何输出不匹配文本。

我也没有把awk当作一种工具 - 如果有一种更简单的方法可以用sed或其他东西来做这件事我会对它开放。

3 个答案:

答案 0 :(得分:5)

您只需要在第一场比赛时退出,如果没有匹配则退出第11行

awk '
    match($0,/(QUOTATION|TAX ... ORDER|STATEMENT)/) {
        print substr($0,RSTART,RLENGTH)
        exit
    }
    NR == 11 {print "UNKNOWN"; exit}
'

答案 1 :(得分:4)

我喜欢glenn jackman's回答,但是,如果你想打印所有10行的匹配,那么你可以尝试这样的事情:

awk '
match($0,/(QUOTATION|TAX ... ORDER|STATEMENT)/) {
    print NR " ---> " substr($0,RSTART,RLENGTH)
    flag=1
}
flag==0 && NR==11 { 
    print "UNKNOWN"
    exit
}'

答案 2 :(得分:2)

你可以这样做..

( head -10 | egrep -o '(QUOTATION|TAX INVOICE|ADJUSTMENT NOTE|
   DELIVERY DOCKET|PICKING SLIP|REMITTANCE ADVICE|PURCHASE ORDER|STATEMENT)' 
    || print "Unkownn" ) | head -1