我想打印文件的所有行,其中每行的第一个元素以数字开头,使用awk
。以下是使用的文件和命令中包含的数据的详细信息:
文件名内容:
12.44.4444goad ABCDEF/END
LMNOP/START joker
98.0 kites
使用的命令:
awk '{ $1 ~ /^\d[a-zA-Z0-9]*/ }' filename
运行上述命令后,提示中不会显示任何结果。 如果需要对上述命令进行任何更正,请告诉我。
答案 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来解析数字,并告诉你字符串末尾不属于它的字符数。