我的工作是使用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
答案 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