awk,字段不匹配但应该匹配

时间:2012-01-22 23:44:09

标签: regex linux shell awk gawk

我有一个文件结构为记录列表,其中字段分隔符为\ t。 我想只提取第二个字段是从1到9的数字的记录,但我的awk脚本不起作用。 awk脚本是

cat file |awk -v FS="\t" '$2 ~ /[0-9]{1}/ {print $0;}'

或者

cat file |awk -v FS="\t" '$2 ~ /.{1}/ {print $0;}'  #because the second fields of my file have  all second fields as number

为什么这些sscript不起作用?正则表达式不是一个好的正则表达式吗?

2 个答案:

答案 0 :(得分:1)

更新

即使间隔为{1},您仍然会匹配23之类的字段,因为2匹配单个数字。你真正想要使用的是锚点,忘记间隔:

awk '$2 ~ /^[0-9]$/{print}' FS="\t" file

问题是使用间隔{1}awk小于版本4不支持间隔。另一方面,gawk会添加以下标记:--re-interval

试试这个:

awk --re-interval '$2 ~ /[0-9]{1}/{print}' FS="\t" file

其他一些注意事项:

  1. 可以在最后分配FS等内置变量,而无需-v
  2. 您只能使用print而不是print $0,因为这是默认行为
  3. 无用地使用catawk可以将文件作为参数,而不是

答案 1 :(得分:1)

如果你想确保第二个字段是一位数字,你真的不需要一个正则表达式:

awk '1 <= $2 && $2 <= 9 {print}'