我有一个文件结构为记录列表,其中字段分隔符为\ 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不起作用?正则表达式不是一个好的正则表达式吗?
答案 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
其他一些注意事项:
FS
等内置变量,而无需-v
print
而不是print $0
,因为这是默认行为cat
。 awk
可以将文件作为参数,而不是答案 1 :(得分:1)
如果你想确保第二个字段是一位数字,你真的不需要一个正则表达式:
awk '1 <= $2 && $2 <= 9 {print}'