我正在试图找出如何使用AWK查找在其完整路径中最多包含两个'a'字符的文件。
以下是我到目前为止所做的,但它没有完成这项工作。
BEGIN{}
{
if( match( $1, ".*[a].*[a].*[^a]+" ) )
print $1
}
END{}
它通过以下命令从名为“data”的文件中读取文件名及其完整路径。
find / -name '*'
我应该修改什么?
答案 0 :(得分:6)
以下被判断得太短,无法自己回答,但这只是我想写的:
^[^a]*(a[^a]*(a[^a]*)?)?$
顺便说一句,您不需要awk
。 grep -E
可以正常使用。
但是现在我想起来了,如果你打算使用awk,下面的内容就更简单了:
awk '!/a.*a.*a/'
答案 1 :(得分:2)
您有三个错误。
^
和$
,否则任意前缀或后缀可能包含一些a
。a
使?
成为可选项。.*
可以包含a
,因此您需要使用[^a]
来匹配非字符。结果将是一个正则表达式,如:
^([^a]*a)?([^a]*a)?[^a]*$
修改:
正如Ed在下面的评论his answer中指出的那样,如果您将--re-interval
标志传递给Awk,则可以使用间隔。
然后表达式为:
^([^a]*a){0,2}[^a]*$
这允许我们说我们希望在0到2之间找到a
s。
答案 2 :(得分:2)
正确的解决方案是:
awk '!/(.*a){3}/' file
如果您的awk不支持RE间隔,请或其中任何一个:
awk 'gsub(/a/,"&") < 3' file
awk 'split($0,x,/a/) < 3' file
所以在任何一种情况下如果你想测试少于17“a”你只需要改变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]*)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?$'
或类似。