2012-12-10 38 views
1

我想弄清楚如何找到在AWK完整路徑中至多有兩個'a'字符的文件。在完整路徑中至多有兩個'a'字符的文件

以下是我到目前爲止的內容,但並未完成這項工作。

BEGIN{} 

{ 
if(match($1, ".*[a].*[a].*[^a]+")) 
print $1 
} 

END{} 

它從通過以下命令單獨創建的名爲「data」的文件中以完整路徑讀取文件名。

find/-name '*' 

我應該修改什麼?

回答

2

你有三個錯誤。

  1. 您需要包括和最終的行開始的行模式^$否則任意前綴或後綴可能包含一些a秒。
  2. 您需要使用括號和?來使a的出現次數爲可選。
  3. .*可以包含a因此您需要使用[^a]來匹配非a字符。

其結果將是一個正則表達式,如:

^([^a]*a)?([^a]*a)?[^a]*$ 

編輯:

愛德指出了以下his answer的意見,如果你通過--re-interval標誌Awk,你可以使用間隔。

表達然後將:

^([^a]*a){0,2}[^a]*$ 

這讓我們說,我們要找到第2介於0和a

+0

非常感謝大家的理解。 :)幫助很大 –

+0

--re-interval只在老版本的GNU awk中需要。較新的gawk版本默認啓用它,就像其他一些awk一樣,而對於其他awks,它根本不可用。 –

6

下判斷太短,對自己的答案,但它是所有我的意思寫:

^[^a]*(a[^a]*(a[^a]*)?)?$ 

順便說一句,你不需要awkgrep -E會正常工作。

但現在,我想起來了,如果你打算用awk,以下是更簡單:

awk '!/a.*a.*a/' 
+0

是的,我已經添加了它們。 – rici

+0

Yeap,這個伎倆。非常感謝。 :)順便說一下,我的任務需要我使用awk。 –

+0

+1爲反轉模式 – Geoff

2

正確的解決方法是這樣的:

awk '!/(.*a){3}/' file 

或者它們,如果你的awk不支持RE間隔:如果你想測試比少

awk 'gsub(/a/,"&") < 3' file 
awk 'split($0,x,/a/) < 3' file 

因此,在這兩種情況下17 「一」 是你只需要改變3至17(例如):

awk '!/(.*a){17}/' file 

,而不是寫:

awk '^[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*(a[^a]*)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?$' 

或類似的。

+0

+1很好的答案。有沒有辦法在大括號中匹配「2個或更少」的實例?換句話說,爲什麼我們不能做'^([^ a] * a){0,2} [^ a] * $'? – Geoff

+0

@Geoff看起來好像是對的。雖然有點難以讓人聯想到不是3個或更多的RE! –

+0

它不適合我,所以我希望你知道。在我的谷歌搜索中,我找不到「X或更少」的表達。 – Geoff