1

我在 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 或其他方法来做到这一点,我愿意接受。

4

3 回答 3

5

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

awk '
    match($0,/(QUOTATION|TAX ... ORDER|STATEMENT)/) {
        print substr($0,RSTART,RLENGTH)
        exit
    }
    NR == 11 {print "UNKNOWN"; exit}
'
于 2013-06-12T00:53:07.830 回答
4

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

awk '
match($0,/(QUOTATION|TAX ... ORDER|STATEMENT)/) {
    print NR " ---> " substr($0,RSTART,RLENGTH)
    flag=1
}
flag==0 && NR==11 { 
    print "UNKNOWN"
    exit
}'
于 2013-06-12T01:40:56.737 回答
2

你可以这样做..

( head -10 | egrep -o '(QUOTATION|TAX INVOICE|ADJUSTMENT NOTE|
   DELIVERY DOCKET|PICKING SLIP|REMITTANCE ADVICE|PURCHASE ORDER|STATEMENT)' 
    || print "Unkownn" ) | head -1 
于 2013-06-12T00:55:26.267 回答