使用awk搜索具有多个数字的行

时间:2011-11-21 13:58:22

标签: awk

这是file1

200
201
202
203
204
205
2001
2002
2003
2004
2005

是否有一个awk oneliner在第一个字段中只找到三位数的行?

7 个答案:

答案 0 :(得分:14)

awk '$1 ~ /^[0-9][0-9][0-9]$/' file1

这会将第一个字段($1)与三位数匹配(请注意^$表示的强制开始和停止范围)。然后打印整行($0)。正则表达式匹配后您不需要{print $0},因为默认操作是打印该行。

如果您想在正则表达式中使用区间表达式运算符{},则需要使用gawk--posix开关:

gawk --posix '$1 ~ /^[0-9]{3}$/' file1

答案 1 :(得分:10)

如果我们可以假设第一个字段只包含数字:

awk 'length($1) == 3' file1

如果没有,请使用其中一个正则表达式解决方案。


另一种解决方案:

awk '$1 >= 100 && $1 <= 999' file1

打印第一个字段的数值在范围(100,999)中的所有行。 这个解决方案有两点需要注意:

  1. 100aap转换为100,然后打印出来。
  2. 005转换为5,但未打印。

答案 2 :(得分:5)

这是一个:

awk '$1 ~ /^[[:digit:]]{3}$/' file1

或者,如果您更喜欢范围而不是POSIX字符类:

awk '$1 ~ /^[0-9]{3}$/' file1

答案 3 :(得分:2)

awk '/^[0-9][0-9][0-9]([^0-9]|$)/ {print $0}' file

See it

要查找只有3位数字的行,请执行以下操作:

awk '/^[0-9][0-9][0-9]$/ {print $0}' file

答案 4 :(得分:1)

有点不正统,但你也可以这样做 -

[jaypal~/Temp]$ cat text7
200
201
202
203
204
205
2001
2002
2003
2004
2005
[jaypal~/Temp]$ awk 'BEGIN{FS="";} NF<4{print}' text7
200
201
202
203
204
205

答案 5 :(得分:0)

awk '{ if ($1 ~ /^[0-9][0-9][0-9]$/) print $0}' file

请注意,我们使用的是一个reg-ex,它指定了3个char类([..]内的任何内容), 0-9。文件的第一个字段表示为$ 1。 '^'和'$'表示字段的开头和结尾。如果我们没有,那么4位或更多位的字段也将匹配。

我希望这会有所帮助。

答案 6 :(得分:0)

awk '{num=$1/1; if (num == $1) if (length($1) == 3) print $0}' file

应与前导零一起使用