AWK以任意顺序匹配至少2位数字和至少2个字母的行

时间:2014-03-05 21:08:28

标签: awk

我的工作是使用AWK match lines with at least 2 digits and at least 2 letters in any order(有些字母用数字分隔)。

这是我的sample.txt:

1
12
123
1234
12345
123456

1a
b23
3c4d
e5f67
gj34qz

我的AWK版本是GNU Awk 4.0.1(Ubuntu Linux)。

我一直试图这样做:

awk '/[0-9]{2,}/ && /[a-z]{2,}/' sample.txt

awk '/[[:digit:]]{2,}/ && /[[:lower:]]{2,}/' sample.txt

但它没有正常工作(它只捕获连续的字符串),例如它跳过:

3c4d

e5f67

2 个答案:

答案 0 :(得分:4)

允许使用.*

之间的字符
awk '/[0-9].*[0-9]/ && /[a-zA-Z].*[a-zA-Z]/'

准确地说是两个字母:

awk '/[0-9].*[0-9]/ && /^[^a-zA-Z]*[a-zA-Z][^a-zA-Z]*[a-zA-Z][^a-zA-Z]*$/'

答案 1 :(得分:1)

您可以使用gsub函数的返回值来计算行中存在的位数和字母数。

gsub函数返回替换次数。所以你可以这样做:

awk '{l=$0;if(gsub(/[[:digit:]]/,x)>=2 && gsub(/[[:lower:]]/,x)>=2) print l}' file

我们将该行存储在变量l中,因为在gsub运行之后,原始行被修改。我们将gsub的返回值检查为>=2。如果两个条件都为真,我们打印该行。

使用您的样本数据,它输出:

$ awk '{l=$0;if(gsub(/[[:digit:]]/,x)>=2 && gsub(/[[:lower:]]/,x)>=2) print l}' file
3c4d
e5f67
gj34qz