2013-06-12 175 views
1

我使用下面的语句在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或其他东西,我可以使用它。

+0

你有没有考虑过使用'if-else'?就像 - awk'{if($ 0 ==“your_match”){print“match”} else {print“no match”}}'' – Bill

+0

如果我错了,请纠正我,但是当我第一次看到它时这样看起来好像会有两个问题 - 首先,我会为每一行触摸到一个“匹配”或“不匹配”,其次我必须写出完整的if-else给每个人一个可能的匹配词(上面的内容是最终列表很长的一个子集) - 使它成为一个非常长的命令。我可能也只是不明白你在暗示什么(并且这是给定的,我会改变'if($ 0 == ...'到'if($ 0〜...') –

+0

@ ChrisO'Kelley是的,但是你可以根据你的习惯需要来适应这种情况,比如不打印,或者根据你的需要做其他事情。但是还有其他的方法可以做到这一点:) – Bill

回答

5

你只需要在第一场比赛以退出,第11行;如果没有匹配

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

这是完美的,它也有点解释了我一直在使用的一些awk语法没有得到..我认为('condition {action}') –

+0

就是这样,如果你省略了这个条件,每一行都会执行这个动作,如果你省略了这个动作,那么默认情况下是'print $ 0' true。你有时会看到'awk'条件{action} 1'' - 尾部'1'是'{print}'的快捷方式' –

2

你可以做到这一点..

(head -10 | egrep -o '(QUOTATION|TAX INVOICE|ADJUSTMENT NOTE| 
    DELIVERY DOCKET|PICKING SLIP|REMITTANCE ADVICE|PURCHASE ORDER|STATEMENT)' 
    || print "Unkownn") | head -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 
}' 
相关问题