AWK匹配以数字开头的字符串

时间:2013-12-28 12:42:55

标签: regex bash unix awk

我想打印文件的所有行,其中每行的第一个元素以数字开头,使用awk。以下是使用的文件和命令中包含的数据的详细信息:

文件名内容:

12.44.4444goad ABCDEF/END   
LMNOP/START joker   
98.0 kites

使用的命令:

awk '{ $1 ~ /^\d[a-zA-Z0-9]*/ }' filename

运行上述命令后,提示中不会显示任何结果。 如果需要对上述命令进行任何更正,请告诉我。

4 个答案:

答案 0 :(得分:4)

要打印以数字开头的行,您可以尝试以下操作:

awk '/^[[:digit:]]+/' file

正如@HenkLangeveld所指出的,你的语法不正确。此外,正则表达式\d在awk中不可用。

答案 1 :(得分:3)

如果您只需要在该行的开头匹配至少一位数字,那么您只需要^匹配一行的开头,[0-9]匹配一位数。

您可以将大括号与if语句结合使用:

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

但这只是为此而言:

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

答案 2 :(得分:2)

放下大括号和\d,如下所示:

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

Awk程序是大块的。一个块是pattern block对,其中block 默认为{ print }。 (空图案默认为 true 。)

/\d/是perl-ism,可能适用于某些版本awk - 而不是我尝试过的版本*。您需要传统 /^[0-9]/ POSIX /^[[:digit:]]/表示法。

* gnu和ast

答案 3 :(得分:2)

从您尝试的解决方案中,它看起来像您想要的那样:

 awk 'NF>1 && $1 ~ /^[0-9.]*$/' filename

如果要包含小数点,则需要明确匹配.,并且需要$锚点才能使*有意义。这将错过第一列看起来像5e39-2.3的行。您可以尝试使用以下方法捕获这些案例:

awk 'NF>1 && $1 ~ /^-?[0-9.]*(e[0-9*])?$/' filename

但此时我会告诉您使用perl并停止尝试使用awk更强大。 也许(这将打印空行......不确定您想要的行为):

perl -lane 'use POSIX qw(strtod); my ($num, $end) = strtod($F[0]);
    print unless $end;' filename

这使用strtod来解析数字,并告诉你字符串末尾不属于它的字符数。