2013-06-12 109 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 
}' 
相關問題