我想弄清楚如何找到在AWK完整路徑中至多有兩個'a'字符的文件。在完整路徑中至多有兩個'a'字符的文件
以下是我到目前爲止的內容,但並未完成這項工作。
BEGIN{}
{
if(match($1, ".*[a].*[a].*[^a]+"))
print $1
}
END{}
它從通過以下命令單獨創建的名爲「data」的文件中以完整路徑讀取文件名。
find/-name '*'
我應該修改什麼?
我想弄清楚如何找到在AWK完整路徑中至多有兩個'a'字符的文件。在完整路徑中至多有兩個'a'字符的文件
以下是我到目前爲止的內容,但並未完成這項工作。
BEGIN{}
{
if(match($1, ".*[a].*[a].*[^a]+"))
print $1
}
END{}
它從通過以下命令單獨創建的名爲「data」的文件中以完整路徑讀取文件名。
find/-name '*'
我應該修改什麼?
你有三個錯誤。
^
和$
否則任意前綴或後綴可能包含一些a
秒。?
來使a
的出現次數爲可選。.*
可以包含a
因此您需要使用[^a]
來匹配非a字符。其結果將是一個正則表達式,如:
^([^a]*a)?([^a]*a)?[^a]*$
編輯:
愛德指出了以下his answer的意見,如果你通過--re-interval
標誌Awk,你可以使用間隔。
表達然後將:
^([^a]*a){0,2}[^a]*$
這讓我們說,我們要找到第2介於0和a
。
正確的解決方法是這樣的:
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]*)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?$'
或類似的。
非常感謝大家的理解。 :)幫助很大 –
--re-interval只在老版本的GNU awk中需要。較新的gawk版本默認啓用它,就像其他一些awk一樣,而對於其他awks,它根本不可用。 –