我在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 :(得分: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